Skip to main content

Request Deduplication

Request Deduplication 是在系統中使用的一種設計,旨在防止相同的請求被多次處理。又可稱作為 Idempotency Handling.

為何請求去重複如此重要?

想像一下,使用者多次點擊「立即購買」按鈕時,或者網路故障導致支付請求被發送兩次。如果沒有去重複機制,這可能導致:

  • 功能瑕疵: 出現非預期用戶體驗。例如,重複處理支付請求會導致客戶被重複扣款
  • 資源浪費: 出現不必要的 CPU 運算 、記憶體和資料庫儲存空間
  • 資料不一致: 重複請求可能導致系統中的非預期資料出現,例如資料庫中出現重複記錄

如何運作?

請求去重複的核心思想是在處理請求之前識別並過濾掉重複的請求。這通常涉及:

  • Deduplication Key: 對於每個請求,產生一個唯一的 Key,創建此鍵的常見方式包括:

    • 雜湊處理: 對請求資料進行 hash 運算 (例如 MD5、SHA-256)
    • UUID/nonce: 客戶端在每個請求中產生含一個唯一的 id
    • 組合關鍵請求參數:連接使用者 ID、訂單 ID 和時間戳等值
  • Deduplication Key 儲存:一旦收到請求時,系統需要檢查此 Key 是否已曾被處理過,這通常涉及將資料儲存在可快速存取的空間中,例如:

    • Memory: 用於非常高速、短暫的去重複
    • Distributed Cache: 用於高負載去重複處理的分散式系統(例如 Redis)
    • Database: 用於 persistent 去重複,可用於請求頻率不高時

重複請求處理方式

  • 首次請求: 如果 Key 不在儲存空間內,則儲存此 Key 並且處理請求
  • 後續請求: 如果 Key 已存在,則該請求被識別為重複請求,可採取以下措施之一:
    • 忽略: 最常見的方法
    • 返回先前回應: 如果先前請求結果可以取得
    • 排隊: 在某些情況下,如果先前請求仍在處理中,則重複請求可以設計成等候請求結果,直到結果取得或逾時處理