使用 Webhooks 處理恰好一次的處理

嗨各位,我正在處理 n8n 中一個更進階的可靠性問題,涉及 webhook 觸發的工作流程。
我有一個工作流程:
Webhook → 處理 → 資料庫
外部服務有時會重試相同的 webhook 事件(例如,由於逾時),所以 n8n 會收到具有相同負載的重複請求。
目前,這會導致:
• 資料庫中有重複記錄
• 重複的下游動作(電子郵件、API 呼叫等)
範例負載:
{
“event_id”: “abc123”,
“user_id”: 42,
“action”: “created”
}
如果相同的 event_id 被傳送兩次,它會被處理兩次。
我已經嘗試過的方法
• 在 Function 節點中進行基本檢查
• 資料庫 upserts
• 新增延遲
但這些都無法完全保證恰好一次的處理。
挑戰
我想確保:
• 每個事件只被處理一次
• 安全處理重試
• 沒有重複的副作用

描述問題/錯誤/問題

錯誤訊息是什麼(如有)?

請分享您的工作流程

(選取畫布上的節點,並使用鍵盤快捷鍵 CMD+C/CTRL+C 和 CMD+V/CTRL+V 來複製和貼上工作流程。)

分享最後一個節點傳回的輸出

您的 n8n 設定的相關資訊

  • n8n 版本:
  • 資料庫(預設值:SQLite):
  • n8n EXECUTIONS_PROCESS 設定(預設值:own、main):
  • 執行 n8n 的方式(Docker、npm、n8n cloud、桌面應用程式):
  • 作業系統:

@Keira_Becky 你遇到了冪等性問題,唯一可靠的解決方案是追蹤已處理的事件,n8n 中沒有內建的「恰好一次」執行。

使用 event_id 作為唯一鍵,讓你的資料庫來強制執行。

試試這個

  1. 在資料庫中儲存 event_id,並加上 UNIQUE 約束

CREATE TABLE events (
event_id TEXT PRIMARY KEY,
payload JSONB
);

  1. 在處理前插入

INSERT INTO events (event_id, payload)
VALUES ({{$json.event_id}}, {{$json}})
ON CONFLICT (event_id) DO NOTHING;

所以如果插入成功 → 處理事件
如果發生衝突 → 略過(已處理過)

感謝 @Niffzy

我透過在處理前插入來解決了