コンテンツにスキップ

システム連携プラグイン (System Integration)

概要

SystemIntegrationPlugin は、外部システムから Vendureへ入るサーバー間連携の入口です。現時点の主な責務は、基幹システムから受信する出荷完了Webhook (system-integration/shipment/notify) の認証、注文解決、出荷反映です。

2026-04時点では、本番環境での安全な比較検証のために、出荷Webhookへ shadow lane を追加しています。これにより、同一入力を productionshadow の2レーンで評価しつつ、本番副作用は production 側だけに限定できます。

受信フロー

  1. X-Commerce-System-Timestamp / X-Commerce-System-Signature を検証する。
  2. production を正本とする処理を実行する。
  3. 設定で有効な場合のみ、同じ payload を shadow でも評価する。
  4. shadow は比較記録だけを残し、本番の fulfillment / 履歴 / 通知は発生させない。
  5. HTTP レスポンスは常に production の結果を返す。

shadow lane の目的

  • production と同じ入力で、将来のロジック変更や連携先変更の影響を比較する。
  • 実ユーザー向けのレスポンスや本番データを壊さずに、出荷Webhookの判定結果を観測する。
  • 「channel を増やす」よりも、execution mode を明示的に渡して副作用境界を切る 方式で、責務の混線を避ける。

shadow lane の制約

v1 で読取するもの

  • 注文番号からの注文解決
  • fulfillment 重複判定
  • 出荷適用計画(対象 line 数、carrier、tracking code)の組み立て

v1 で行わないもの

  • fulfillment 作成
  • fulfillment の Shipped 遷移
  • 注文履歴メモの追加
  • 上記を契機に発火する出荷完了メールや関連通知

比較で確認する項目

shadow capture では少なくとも以下を production と突合できるようにします。

項目 意味
orderCode 対象注文コード
carrierName 配送会社名
trackingNumber 追跡番号
duplicateDetected 重複配送判定
plannedLineCount fulfillment 対象 line 数
sideEffectsApplied 本番副作用を実行したか
fulfillmentId / fulfillmentState production 側で実際に作成された fulfillment 情報

設定

出荷Webhookの shadow lane は SystemIntegrationPlugin.init() に以下の設定で渡します。

設定 役割 既定値
shadowShipmentWebhookEnabled shadow 実行の ON/OFF false
shadowCaptureEnabled production/shadow 比較記録の ON/OFF true

Vendure Server では次の環境変数から配線します。

環境変数 説明
SHIPMENT_WEBHOOK_SHADOW_ENABLED 出荷Webhookの shadow 実行を有効化する
SHIPMENT_WEBHOOK_SHADOW_CAPTURE_ENABLED shadow 比較記録を有効化する

運用上の注意

  • production の主系可用性が最優先です。shadow failure は production レスポンスを失敗させません。
  • 本番事故を避けるため、shadow は副作用 no-op を原則とします。状態遷移の再現が必要になった場合は、shadow DB / schema 分離を別フェーズで追加してください。
  • shadow lane の ON/OFF は設定フラグで切り替え、kill switch として即時に無効化できる状態を維持してください。

受け入れ確認

  1. shadow 無効時、出荷Webhook は従来どおり fulfillment を 1 回だけ作成すること。
  2. shadow 有効時も、production 側の fulfillment 数や履歴件数が追加で増えないこと。
  3. shadow 有効時に比較記録が残ること。
  4. shadow failure が起きても、production 成功時の HTTP レスポンスが維持されること。

関連ドキュメント