Webhookから失敗・重複まで1本で処理する

合成問い合わせを受け、入力検証、分類、内部API連携、再試行、重複防止、HTTP応答まで実装。workflow JSON、実行証跡、再現手順を公開する。

実績の境界:当サイトの隔離ラボで作った技術ポートフォリオ。顧客案件の実績ではない。実在の個人情報、資格情報、外部SaaS、AI APIは使っていない。第三者アフィリエイトリンクなし。

結論:5系統を分け、全部PASS

n8n 2.33.7のWebhookへ合成問い合わせを送り、正常、一時障害からの復旧、重複、継続障害、入力不正を確認した。上流APIは同じinternal networkのモック。外部ネットワークには出ていない。

正常2021件作成
一時5033回目再試行後に成功
重複0件増既存ticket返却
異常400 / 502入力 / 上流を分離
試験期待実測
正常問い合わせを1件作成202 / created
一時障害503を再試行し復旧503×2 → 3回目created
重複同じcase_idを二重作成しない202 / duplicate / 保存件数不変
継続障害3回失敗後に上流障害を返す502 / upstream_unavailable
入力不正上流APIを呼ばず拒否400 / rejected / API試行0

実装した10ノード

n8n 2.33.7で実装した問い合わせ振り分けworkflow。Webhook、入力検証、IF、HTTP Request、正常・入力不正・上流障害の応答分岐を表示
実際にimport・publish・実行したn8n 2.33.7のEditor。画面内に資格情報・個人情報なし。撮影後、一時環境はvolumeごと削除。
  1. Receive Inquiry:POST WebhookでJSONを受ける。
  2. Validate and Normalize:Code nodeで必須項目、長さ、case_id形式を検証し、4カテゴリへ固定分類する。
  3. Is Valid:正常系と入力不正を分ける。
  4. Route Through Mock API:HTTP Requestで内部APIへ送る。timeout 3秒、最大3回、250ms間隔。
  5. Build Accepted Response:作成・重複の応答を整形する。
  6. Respond Accepted:受付結果を202で返す。
  7. Build Rejected Response:不正項目だけを返し、入力本文を再掲しない。
  8. Respond Rejected:入力不正を400で返す。
  9. Build Upstream Failure:内部エラー詳細を公開せず、固定エラーへ変換する。
  10. Respond Upstream Failure:上流継続障害を502で返す。

再試行と重複防止を分ける

HTTP Requestは503を最大3回まで再試行する。一時障害ケースは1回目・2回目が503、3回目に作成成功。継続障害ケースは3回とも503で、n8nがerror outputへ流し、Webhookには502を返した。

重複防止はcase_idを冪等キーとしてモックAPI側で実装。同じ問い合わせを再送すると新規作成せず、既存ticketとduplicate: trueを返す。HTTP Request nodeのretryだけでは二重作成を防げないため、受信先の冪等性を別に持たせた。

本番化時:このモックは逐次実行。並列リクエストではDBのunique制約やatomic upsertが必要。外部APIが冪等キー非対応なら、状態変更処理の自動retryをそのまま有効にしない。

入力と出力

入力はcase_idsubjectbodyの3項目。出力は受付可否、状態、case_id、ticket_id、category、needs_review、duplicateへ限定した。

POST /webhook/portfolio-inquiry-routing
{
  "case_id": "case-normal-001",
  "subject": "請求書の確認",
  "body": "今月分の請求金額を確認したい。"
}
HTTP 202
{
  "ok": true,
  "status": "created",
  "case_id": "case-normal-001",
  "ticket_id": "ticket-case-normal-001",
  "category": "billing",
  "needs_review": false,
  "duplicate": false
}

成果物をダウンロード

公開workflowはinactive。Credentialオブジェクトなし。URLは環境変数PORTFOLIO_MOCK_API_URLから読む。APIキーを使う実装へ変える場合はn8n Credentialへ登録し、export JSONへ秘密値を入れない。

この実装が示さないこと

  • 顧客案件、受託実績、本番SLA、長期安定性
  • 実在データ、個人情報、外部SaaS、OAuth、APIキー管理
  • AI分類品質、共通ベンチ100件の分類・要約精度
  • 並列実行、DB一意制約、高可用性、監視、夜間復旧

Cowork・Make・n8n共通ベンチは3製品とも未測定のまま。このポートフォリオの固定ルール分類を、そのAI比較結果として扱わない。

公式情報

FROM LAB TO PRODUCTION

実業務へ移す前に、
失敗と復旧を設計する。

1ワークフロー、主要8ステップ、接続3サービス以内の固定範囲。認証、重複、監視、受入条件を先に決める。

設計レビュー・実装を相談する

検証:n8n 2.33.7 / 合成データ / external networkなし / customer dataなし / 2026-08-13 JST