接口冪等怎麼做提示詞(重複提交、支付回調、消息重複消費的冪等方案)

設計下單、支付、退款、發券這類「執行兩次就會出事」的接口時用:讓 AI 按你的場景識別重複請求的來源,選出合適的冪等方案(冪等鍵、唯一約束、狀態機),寫清表結構和代碼,並覆蓋並發與失敗重試的邊界。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
請為下面的接口設計冪等方案。

接口資訊:
- 接口作用:[如創建訂單、支付回調、發放優惠券]
- 調用方:[調用方](例:用戶 App、第三方支付平台、消息隊列消費者)
- 技術棧:[語言/框架/數據庫/緩存]
- 當前實現(如果有):
  [粘貼代碼或說明]

請依次完成:
1. 列出這個接口在現實中會被重複調用的所有來源,例如:用戶連點、前端超時自動重試、網關重試、第三方回調重複通知、消息至少投遞一次、運維手動重放。
2. 確定「什麼算同一次請求」:用哪個字段或組合作為冪等鍵(客戶端生成的請求號、業務單號、第三方流水號),說明為什麼。
3. 選擇方案並說明理由:
   - 數據庫唯一約束(最可靠的兜底);
   - 冪等記錄表:鍵、狀態(處理中 / 成功 / 失敗)、響應結果、過期時間;
   - 狀態機:只允許「待支付 → 已支付」這樣的單向流轉,用帶條件的更新實現;
   - 緩存預佔(如 SET NX)只作為減少重複處理的手段,不能單獨作為最終保證。
4. 寫清邊界情況的處理:
   - 第一次請求還在處理中,第二次請求到達,返回什麼;
   - 第一次處理失敗了,同一個鍵能否重試;
   - 第二次請求的參數和第一次不同(鍵相同、內容不同),怎麼處理;
   - 冪等記錄保留多久。
5. 輸出表結構(建表語句)、核心代碼和對調用方的接口約定(請求頭或參數名、重複請求時的返回)。
6. 寫出驗證用的測試場景清單。

高亮處換成你自己的內容:[如創建訂單、支付回調、發放優惠券]、[調用方]、[語言/框架/數據庫/緩存]、[粘貼代碼或說明]

ChatGPT Plus 充值

已被複製 0 次

使用說明

怎麼填變量:[調用方] 決定了冪等鍵從哪裏來。用戶端接口通常讓前端在進入頁面時生成一個請求號;第三方回調直接用對方的流水號;消息消費用消息 ID 或業務單號。

常見坑:

  • 只靠「先查有沒有、沒有再插入」做去重,並發時兩個請求同時查不到,照樣重複。最後一定要有數據庫唯一約束兜底。
  • 只用緩存的 SET NX 做冪等,緩存過期或重啟後就失效了,而且業務失敗時容易忘記釋放。
  • 同一個冪等鍵帶着不同的參數再來一次,應該明確拒絕(很多支付平台的做法是返回錯誤),而不是悄悄返回第一次的結果。

追問技巧:方案出來後追問「如果在寫入冪等記錄之後、業務完成之前進程崩潰,會發生什麼,怎麼恢復」。

示例輸出

示例,僅供參考(支付回調,節選)

冪等鍵:支付平台的交易流水號 trade_no,同一筆支付無論通知多少次都相同。

sql
CREATE TABLE payment_notify (
  trade_no    VARCHAR(64) PRIMARY KEY,
  order_id    BIGINT NOT NULL,
  status      VARCHAR(16) NOT NULL,   -- PROCESSING / DONE
  created_at  DATETIME NOT NULL
);

處理流程:插入記錄(主鍵衝突說明已處理過,直接返回成功)→ 訂單狀態用 UPDATE orders SET status='PAID' WHERE id=? AND status='UNPAID' 流轉 → 受影響行數為 0 時說明已支付,不重複發貨。

情況返回
重複通知且已處理完成返回平台要求的「成功」應答,不再處理
金額與訂單不一致拒絕並告警,不更新訂單

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~