自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

一、什么是接口冪等性?

1.1 數(shù)學概念到編程實踐

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

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

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

現(xiàn)代分布式系統(tǒng)面臨三大不可靠要素:

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

二、典型應用場景分析

2.1 前端重復提交

圖片圖片

2.2 接口超時重試

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

圖片圖片

2.3 消息隊列重復消費

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

圖片圖片

三、六大核心解決方案

3.1 Token機制(防抖利器)

圖片圖片

實現(xiàn)要點:

  • Token需要設置合理過期時間(建議5-30秒)
  • Redis操作要保證原子性(Lua腳本實現(xiàn))
  • 前端需要防止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) {
        // 執(zhí)行業(yè)務邏輯
        return Result.success();
    } else {
        return Result.error("重復請求");
    }
}

3.2 唯一索引(簡單有效)

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

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 樂觀鎖(更新操作首選)

通過版本號控制數(shù)據更新:

圖片圖片

訂單狀態(tài)變更示例:

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

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

Redisson實現(xiàn)示例:

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

3.5 狀態(tài)機(業(yè)務流程控制)

電商訂單狀態(tài)流轉設計:

圖片圖片

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

金融交易系統(tǒng)常用方案:

圖片圖片

四、實戰(zhàn)案例解析

4.1 電商秒殺系統(tǒng)設計

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

解決方案:

  • 預扣庫存:Redis緩存庫存數(shù)
  • 請求序列號:用戶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("已售罄");
    }
    
    // 發(fā)送MQ消息
    mq.send(new OrderMessage(userId, activityId));
    return Result.success("排隊中");
}

4.2 銀行轉賬系統(tǒng)

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

技術方案:

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

五、方案選型指南

方案

適用場景

性能影響

實現(xiàn)復雜度

可靠性

Token機制

表單提交類場景

唯一索引

數(shù)據創(chuàng)建類操作

樂觀鎖

數(shù)據更新類操作

分布式鎖

高并發(fā)寫操作

狀態(tài)機

多狀態(tài)流轉業(yè)務

請求序列號

金融級復雜事務

最高

選型建議:

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

六、常見問題解答

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

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

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

  • 使用Jmeter進行并發(fā)重復請求測試
  • 自動化測試框架重復調用接口
  • 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

數(shù)據重復提交Java

2021-01-13 11:23:59

分布式冪等性支付

2024-11-07 11:17:50

2021-01-18 14:34:59

冪等性接口客戶端

2024-06-24 01:00:00

2022-05-23 11:35:16

jiekou冪等性

2024-08-29 09:01:39

2009-12-08 09:47:39

2025-01-20 10:22:23

2024-08-30 11:11:01

2024-06-07 09:06:36

2011-09-13 15:51:54

刪除數(shù)據庫重復行

2021-01-20 07:16:07

冪等性接口token

2011-02-24 10:56:34

人才

2011-07-21 16:41:39

外鏈

2023-03-07 08:19:16

接口冪等性SpringBoot

2024-03-13 15:18:00

接口冪等性高并發(fā)
點贊
收藏

51CTO技術棧公眾號