嗨各位,我正在運行一個自架的 n8n 實例,它接收來自外部系統的 webhook 事件。在正常流量下一切正常,但當突然出現流量尖峰時,數百或數千個 webhook 執行可能會幾乎同時開始。
每次執行目前做的是:
SELECT id, status
FROM webhook_jobs
WHERE tenant_id = $1
AND event_id = $2;
如果記錄不存在,我插入它:
INSERT INTO webhook_jobs (
tenant_id,
event_id,
status,
created_at
)
VALUES (
$1,
$2,
'pending',
NOW()
);
然後工作流程繼續處理事件。
問題是在流量尖峰期間,我看到 PostgreSQL 連線使用量增加、查詢變慢,有時候當同一個事件被多次傳送時,偶爾會出現重複處理。
我知道 webhook 提供商可以重試事件,所以我不想假設每個 webhook 都代表唯一的事件。
我正在考慮將工作流程改為使用唯一約束:
CREATE UNIQUE INDEX webhook_jobs_event_idx
ON webhook_jobs (tenant_id, event_id);
和原子性插入:
INSERT INTO webhook_jobs (
tenant_id,
event_id,
status,
created_at
)
VALUES (
$1,
$2,
'pending',
NOW()
)
ON CONFLICT (tenant_id, event_id)
DO NOTHING
RETURNING id;
然後我可以檢查 INSERT 是否返回 ID,再決定是否允許工作流程繼續處理。
我也在考慮將重型處理移到隊列中,這樣 webhook 可以快速回應,而不是讓 webhook 執行在進行昂貴操作時一直保持運行。
對於接收高流量且偶爾重複 webhook 的生產級 n8n 設置,推薦的架構是什麼?
描述問題/錯誤/問題
錯誤訊息是什麼(如果有的話)?
請分享您的工作流程
(在畫布上選擇節點,並使用鍵盤快捷鍵 CMD+C/CTRL+C 和 CMD+V/CTRL+V 來複製和貼上工作流程。)
分享最後一個節點返回的輸出
關於您的 n8n 設置的資訊
- n8n 版本:
- 資料庫(預設:SQLite):
- n8n EXECUTIONS_PROCESS 設定(預設:own, main):
- 執行 n8n 的方式(Docker、npm、n8n cloud、桌面應用程式):
- 作業系統: