成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

接口冪等性設計:六種解決方法讓重復請求不再成為系統隱患

開發 前端
在數學中,冪等運算滿足 ??f(f(x)) = f(x)?? 的特性。比如絕對值函數 ??abs(abs(x)) = abs(x)??。在編程領域,接口冪等性指:無論調用次數多少,對系統狀態的影響與單次調用相同。

一、什么是接口冪等性?

1.1 數學概念到編程實踐

在數學中,冪等運算滿足 f(f(x)) = f(x) 的特性。比如絕對值函數 abs(abs(x)) = abs(x)。在編程領域,接口冪等性指:無論調用次數多少,對系統狀態的影響與單次調用相同。

舉個真實案例:某電商平臺支付接口未做冪等處理,用戶點擊支付按鈕后因網絡延遲重復提交,導致同一訂單被扣款3次,最終引發用戶投訴。這就是典型的冪等性缺失導致的問題。

1.2 為什么需要關注冪等性?

現代分布式系統面臨三大不可靠要素:

  • 用戶不可靠(手抖多點)
  • 網絡不可靠(超時重傳)
  • 系統不可靠(服務重試)

二、典型應用場景分析

2.1 前端重復提交

圖片圖片

2.2 接口超時重試

某金融系統調用第三方支付接口超時后的處理流程:

圖片圖片

2.3 消息隊列重復消費

消息中間件的重試機制可能導致重復消費:

圖片圖片

三、六大核心解決方案

3.1 Token機制(防抖利器)

圖片圖片

實現要點:

  • Token需要設置合理過期時間(建議5-30秒)
  • Redis操作要保證原子性(Lua腳本實現)
  • 前端需要防止Token泄露
// SpringBoot示例代碼
@PostMapping("/createOrder")
public Result createOrder(@RequestHeader("X-Token") String token) {
    String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
    Long result = redisTemplate.execute(
        new DefaultRedisScript<>(script, Long.class),
        Collections.singletonList("order:token:" + token),
        token);
    
    if(result == 1) {
        // 執行業務邏輯
        return Result.success();
    } else {
        return Result.error("重復請求");
    }
}

3.2 唯一索引(簡單有效)

適用場景:創建類操作(注冊、下單等)

CREATE TABLE orders (
    id BIGINT PRIMARY KEY,
    order_no VARCHAR(32) UNIQUE,
    ...
);

異常處理示例:

try {
    orderDao.insert(order);
} catch (DuplicateKeyException e) {
    log.warn("重復訂單:{}", order.getOrderNo());
    return Result.error("訂單已存在");
}

3.3 樂觀鎖(更新操作首選)

通過版本號控制數據更新:

圖片圖片

訂單狀態變更示例:

UPDATE orders 
SET status = 'PAID', version = version + 1 
WHERE order_no = '202404211234' 
AND version = 2;

3.4 分布式鎖(高并發場景)

Redisson實現示例:

public Result deductStock(String productId) {
    String lockKey = "lock:product:" + productId;
    RLock lock = redissonClient.getLock(lockKey);
    
    try {
        if(lock.tryLock(3, 30, TimeUnit.SECONDS)) {
            // 業務邏輯
            return doDeductStock();
        }
        return Result.error("系統繁忙");
    } finally {
        lock.unlock();
    }
}

3.5 狀態機(業務流程控制)

電商訂單狀態流轉設計:

圖片圖片

3.6 請求序列號(復雜業務流)

金融交易系統常用方案:

圖片圖片

四、實戰案例解析

4.1 電商秒殺系統設計

挑戰:10萬QPS下如何保證庫存扣減的冪等性?

解決方案:

  • 預扣庫存:Redis緩存庫存數
  • 請求序列號:用戶ID+秒殺場次生成唯一ID
  • 異步落庫:MQ消費保證最終一致性
// 偽代碼示例
public Result seckill(String userId, String activityId) {
    String bizId = userId + ":" + activityId;
    if(redis.setnx(bizId, "1") == 0) {
        return Result.error("重復請求");
    }
    redis.expire(bizId, 30);
    
    // 預扣庫存
    Long stock = redis.decr("stock:" + activityId);
    if(stock < 0) {
        return Result.error("已售罄");
    }
    
    // 發送MQ消息
    mq.send(new OrderMessage(userId, activityId));
    return Result.success("排隊中");
}

4.2 銀行轉賬系統

關鍵需求:保證轉賬請求即使重復也不會多扣款

技術方案:

  • 全局交易流水號(支付系統生成)
  • 事務表唯一索引
  • 賬戶余額變更使用CAS操作
UPDATE account 
SET balance = balance - 100, 
    version = version + 1 
WHERE user_id = 123 
AND version = 5;

五、方案選型指南

方案

適用場景

性能影響

實現復雜度

可靠性

Token機制

表單提交類場景

唯一索引

數據創建類操作

樂觀鎖

數據更新類操作

分布式鎖

高并發寫操作

狀態機

多狀態流轉業務

請求序列號

金融級復雜事務

最高

選型建議:

  • 簡單業務優先使用唯一索引/樂觀鎖
  • 高并發場景選擇Redis+Token機制
  • 資金交易類必須使用請求序列號
  • 復雜業務流程結合狀態機設計

六、常見問題解答

Q:已經用了數據庫事務還需要做冪等嗎?A:事務只能保證操作的原子性,不能防止重復請求。例如重復提交相同參數的請求,事務中仍然會插入重復數據。

Q:GET請求需要做冪等處理嗎?A:根據HTTP規范,GET是天然冪等的。但實際開發中如果GET請求有副作用(如記錄日志),仍需要特殊處理。

Q:如何測試接口冪等性?推薦測試方案:

  • 使用Jmeter進行并發重復請求測試
  • 自動化測試框架重復調用接口
  • Chaos Engineering模擬網絡重傳
責任編輯:武曉燕 來源: 草捏子
相關推薦

2025-03-17 08:07:11

2023-08-29 13:53:00

前端攔截HashMap

2010-10-22 16:29:11

SQL Server刪

2022-05-25 09:55:40

數據重復提交Java

2009-12-08 09:47:39

2021-01-13 11:23:59

分布式冪等性支付

2024-08-30 11:11:01

2024-11-07 11:17:50

2024-06-24 01:00:00

2022-05-23 11:35:16

jiekou冪等性

2024-08-29 09:01:39

2021-01-18 14:34:59

冪等性接口客戶端

2011-09-13 15:51:54

刪除數據庫重復行

2024-06-07 09:06:36

2011-02-24 10:56:34

人才

2025-01-20 10:22:23

2011-07-21 16:41:39

外鏈

2021-01-20 07:16:07

冪等性接口token

2022-02-01 15:44:33

Windows 10藍屏死機

2020-10-27 10:33:01

物聯網
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲播放一区 | 精品久久久久久久久久久 | 国产精品免费观看视频 | 天天天操操操 | 亚洲免费视频在线观看 | 欧美福利精品 | 中文字幕国产一区 | 国产ts人妖另类 | 亚洲精品国产电影 | 欧美福利视频 | 久久久精品天堂 | 美女福利网站 | 成人av免费 | 国产亚洲一区在线 | 一区二区免费在线视频 | 91视视频在线观看入口直接观看 | 国产成人综合一区二区三区 | 在线观看日韩 | 久热精品在线播放 | 午夜电影网站 | 日韩av成人 | 黄色成人av| 波多野结衣在线观看一区二区三区 | 99爱视频 | 亚洲一区二区三区在线播放 | 欧美日韩国产精品一区二区 | 国产在线中文字幕 | 国产精品成人品 | 亚洲视频在线观看 | 国产精品亚洲精品 | 日韩av在线不卡 | 蜜桃视频一区二区三区 | 99爱视频 | 狠狠色狠狠色综合日日92 | 天天操夜夜爽 | 一区二区三区电影网 | 97精品超碰一区二区三区 | 男女羞羞视频在线观看 | 欧美日韩国产高清视频 | 精品久久久久一区二区国产 | 日韩一区二区成人 |