IOSOR 知識庫

割接期間的 dual-write 視窗風險

同一則訊息兩個 webhook 是 debit 與 DLR 風險。限制 dual-write 視窗,對資金事件去重,並以單一 ledger 擁有者退出。

dual-write 視窗代表同一則 outbound 訊息可能同時打到新舊兩個 webhook endpoint——只要 cutover 未關閉。這不是安全網,而是 debit 與 DLR 風險。財務看到雙列;ops 看到雙份 delivered 時鐘;買家看到與記憶中傳送不一致的 ledger。

IOSOR cutover 把 dual-write 當作有退出負責人的計時例外。若兩個 endpoint 在無冪等故事下保持 Live,hold 與帳單會在整週發票週期漂移。

流量拆分前命名 dual-write 視窗

在第二個 endpoint 接收 production 事件前寫明開始、結束與退出負責人。把視窗寫進割接工單,避免 DLR 緊張時開發「悄悄延長」。未命名視窗會變成永久分叉。

列出允許 dual-write 的事件類型(僅 DLR,或 send+DLR)。禁止組合寫在工單標題,而不是首次雙扣後的走廊閒聊。

兩個 endpoint Live 時對資金事件去重

把每個 webhook payload 對應到財務可引用的冪等鍵。拒絕或合併重複的 delivered/failed,使錢包每條 message id 只開一個 hold、只關一次 debit。重試可以;雙份資金不行。

若新舊 endpoint 對最終狀態爭執,凍結 message id 並匯出兩邊 payload。不要讓發票週把「兩邊」對成兩列可計費紀錄。

用硬退出時鐘限制視窗

設定 dual-write 最長時長,以及時鐘歸零時關掉舊 endpoint 的 kill switch。只能用書面變更與新時鐘延長——絕不把兩個 URL 留在密鑰庫「到下個衝刺」。

把時鐘與第二 endpoint 交接清單配對,讓 ops 知道哪個 URL 成為唯一擁有者。一句「我們再看看」不是退出。

割接後證明單一 ledger 擁有者

舊 endpoint 停止後,匯出 dual-write 時段與之後第一個安靜小時的 hold-versus-debit。確認每條 message id 只有一個錢包擁有者。然後才在工單標記 cutover complete。

若雙列仍在,提高試點量前重開凍結清單。dual-write 殘留是 ops 缺陷,不是定價爭論。

相關營運路徑

從 IOSOR 開始

命名 dual-write 時鐘與負責人,為資金事件接上冪等,並在舊 URL 上設置 kill switch。讓一條走廊穿過視窗,匯出雙風險列,在發票週關閉前退出到單一 endpoint。 割接前把 spend 證明與買家文案清洗寫進同一份密封地圖,財務簽字後再換 Live 金鑰。 kill 時刻一到就關掉雙寫,不要用聊天把視窗拖長。 割接前把 spend 證明與買家文案清洗寫進同一份密封地圖,財務簽字後再換 Live 金鑰。 kill 時刻一到就關掉雙寫,不要用聊天把視窗拖長。

IOSOR 要點

dual-write 是計時風險,不是安慰毯:同一則訊息兩個 webhook 可能加倍 DLR 與 debit。限制視窗,用冪等去重資金,並在宣稱 cutover 完成前證明單一 ledger 擁有者。

這篇指南有幫助嗎?

相關指南