AI活用

n8nの二重実行を防ぐ|再試行・同時送信・再起動を切り分ける

n8nの再試行と重複防止を分け、同じ依頼のIDと保存結果で照合。永続DBの同時送信・応答喪失・再起動のラボ結果と、保証できない条件を紹介します。

この記事の目次
  1. 実行IDと、依頼のIDを分ける
  2. 保存直後に応答が消えたときは、結果が不明になる
  3. 同時送信では、確認と作成を一つの操作にする
  4. 今回試したのは、永続DBを使う合成データのラボ
  5. 実APIへ置き換える前に、三つの質問へ答える
  6. 次に知りたいこと

二重実行を防ぐには、同じ依頼のIDと、保存先が重複をどう扱うかを決めます。再試行を増やす設定だけでは、一回分の処理になるとは限りません。保存直後の通信断も試験に含めてください。

実行IDと、依頼のIDを分ける

同じ問い合わせを送り直すと、n8nでは別の実行が始まる場合があります。新しい実行IDだけで判断すると、同じ依頼を別件として作る可能性があります。重複を見分けるキーには、送り直しても変わらない受付IDや原稿IDを使います。

キーと一緒に内容のhashも保存すると、同じキーへ違う内容が届いた場合を区別できます。例えば原稿の版が違うのに同じキーなら、古い結果を無条件に返さず、更新か入力の衝突かを判断してください。

スポンサーリンク

保存直後に応答が消えたときは、結果が不明になる

「保存先へ送る→保存される→成功を受け取る」の間で通信が切れると、送信側は失敗に見えても保存先には結果が残る場合があります。ここで新しい作成を送れば、同じ問い合わせが二件できる可能性があります。

状態は未処理、処理中、完了、要確認などに分けます。タイムアウトを未処理へ戻す前に、保存先が同じキーで結果を返せるか、受付IDから照会できるかを確認します。どちらもできなければ、確認待ちへ止める条件を決めます。

同時送信では、確認と作成を一つの操作にする

「まだないか検索→なければ作成」の二つの操作では、二つの実行がどちらも検索を通過できます。DBの一意制約などで同じキーを一件だけ保存し、すでに存在すれば既存の結果へ戻る設計を使います。

n8nのRemove Duplicatesは重複を見分ける用途に使えますが、その後の外部APIの保存まで一回だけになる保証とは別です。ノードの設定と、書き込み先の処理契約を分けて確認してください。

今回試したのは、永続DBを使う合成データのラボ

Devsでは2026年10月10日、SQLiteの一意キーと保存処理を使い、次の状況を実行しました。n8nのノードや外部SaaSを動かした試験ではなく、保存先の性質を確認するローカルのラボです。

試験 確認した結果
正常な一件 保存一件
同じ依頼を二回 新規一件、二回目は既存結果
同じキーで内容が違う 衝突として返し、追加保存なし
20件の同時送信 新規一件、重複19件
保存後にプロセスが落ち、再送 新しいプロセスから既存結果を取得
別プロセスで同じ依頼を再送 永続DBの記録で一件を維持
まだ保存していない依頼 再起動後に新規一件を保存
キー非対応の保存先へ、応答喪失後に再送 二件保存された。対策なしの反例

一件を維持できたのは、同じSQLite DB内の一意制約と確定した保存記録を使えた条件です。異なる外部API、決済、メール送信などへ、この結果をそのまま保証として移せません。

合成データのラボコードを保存する/実行した8ケースの結果を保存する

実APIへ置き換える前に、三つの質問へ答える

  1. 同じ依頼を見分けるキーは、送り直しても変わらないか。
  2. 保存先は同じキーを一件へ制限するか、既存結果を照会できるか。
  3. 保存したか不明なとき、何を確認してから再送するか。

最初は同じ合成入力を二回送って、応答だけでなく保存件数を見ます。その後、同時送信、保存直後の通信断、再起動を順に加えてください。保証できない条件が残るなら、その操作の自動再送を止めることも判断に含めます。

一時的な失敗の戻し方は通知・再試行・停止の分け方へ、WordPressの投稿IDとの照合は下書きの入稿手順へ分担します。

スポンサーリンク