信頼性設計

トークン自動更新、ロック機構、エラー対策で安定稼働を実現

信頼性トークン更新ロック機構エラーハンドリング冪等性
読了時間: 11分

背景

マルチロケーション対応の連携アプリを構築する際、システムの信頼性は非常に重要です。

標準連携では内部で処理されていたエラーハンドリングや重複防止を、独自実装では自分で設計する必要があります。「いつの間にか動かなくなっていた」という事態を防ぐため、様々な対策を実装しました。

設計上の課題

独自連携アプリでは、以下の問題に対処する必要がありました:

  • 認証トークンの期限切れ - NextEngine APIのトークンには有効期限がある
  • 二重処理 - Webhookの再送で同じ注文が複数回処理されるリスク
  • 同時実行 - 定期処理が重複して実行されるリスク
  • エラーの見落とし - 問題発生に気づかない

認証トークンの自動更新

NextEngine APIとの連携には認証トークンが必要です。このトークンには有効期限があり、期限が切れるとシステムが動かなくなります。

トークンの有効期限を常に監視し、期限切れ前に自動的に更新する仕組みを実装しました。

トークン更新フロー
API呼び出し前

トークンの有効期限をチェック

期限判定

残り日数を確認

30日以上
そのまま使用
30日未満
更新処理を開始
期限切れ
緊急更新

更新処理の詳細:

更新処理
クールダウンチェック

5分間の連続更新防止

新しいトークンを取得

NextEngine APIへリクエスト

トークンを保存

保存結果を確認

成功
新トークンで処理継続
失敗
環境変数にフォールバック

トークン管理のポイント

  • 余裕を持った更新 - 有効期限の30日前から更新を試みる
  • 連続更新防止 - 5分間のクールダウンで無駄なリクエストを防止
  • 複数のフォールバック経路 - 更新失敗時も別の手段で対応
  • アラート表示 - エラー時は管理画面にアラートを表示

処理中ロック機構

同じ処理が同時に複数実行されると、データの不整合や二重送信が発生します。分散ロックを採用してこれを防いでいます。

ロックの取得と解放

ロック機構
ロックキーの取得を試みる

SETNX操作

取得結果

ロックの状態を確認

取得成功
処理を開始、TTL=25分を設定
取得失敗
他の処理が実行中、スキップ
本処理を実行

メイン処理

ロックを解放

finallyブロックで確実に実行

ロックの安全設計

  • TTL(Time To Live)付き - 異常終了してもロックが永続しない
  • 25分のTTL - 通常処理時間に余裕を持った設定
  • 確実な解放 - finallyブロックでエラー時も解放

冪等性(べきとうせい)の確保

同じ処理を複数回実行しても、結果が1回実行した場合と同じになる性質を「冪等性」といいます。Webhookは再送される可能性があるため、これは非常に重要な概念です。

冪等性キーの生成

冪等性チェック
キーを生成

SHA1ハッシュ(注文ID + 出荷日時 + 追跡番号)

キーの存在確認

処理済みかどうか判定

キーが存在
すでに処理済み、スキップ
キーなし
新規処理、完了後にキーを保存(90日保持)

冪等性が重要な理由

  • ネットワーク障害 - 送信成功したがレスポンスが届かない場合、再送が発生
  • タイムアウト - 処理完了したがタイムアウトで失敗扱いになる場合
  • リトライ - エラー時の自動リトライで同じリクエストが複数回届く

いずれの場合も、冪等性があれば二重処理を防げます。

ログの階層構造

用途に応じて適切なログレベルを設定しています:

DEBUG
用途詳細な診断情報
出力条件開発環境のみ
INFO
用途主要な操作記録
出力条件本番・開発共通
WARN
用途回復可能な問題
出力条件本番・開発共通
ERROR
用途致命的なエラー
出力条件本番・開発共通

ログに含まれる情報

  • タイムスタンプ - ISO 8601形式で記録
  • 環境名 - production/staging/development
  • 処理種別 - order_sync, fulfillment_sync など
  • 処理結果 - 成功/失敗、処理件数など
  • エラー詳細 - エラー時はメッセージとスタックトレース

機密情報の保護

  • トークンの非出力 - 認証トークンはログに出力しない
  • 個人情報の除外 - 顧客の個人情報はログから除外
  • プレビュー表示 - 必要な場合は先頭10文字のみ表示

データ永続化の多層構造

データの保存は複数の層で冗長化しています:

データ永続化レイヤー
第1層:KVストレージ(主要データ)

トークン(暗号化)・店舗設定・同期状態・ロック

フォールバック
第2層:環境変数

初期トークン・暗号化キー・単一店舗設定(後方互換性)

監査用
第3層:データベース(監査ログ)

Webhookログ・注文同期ログ・エラーログ(7日間保持)

エラーリカバリーパターン

様々なエラーに対して、適切な回復処理を設計しています:

トークン期限切れ
対処方法自動更新 → 再試行
結果処理継続
一時的なAPI障害
対処方法次回スケジュールで再試行
結果自動回復
追跡番号未入力
対処方法PENDING状態で保存、後日再処理
結果データ欠損なし
重複Webhook
対処方法冪等性チェックでスキップ
結果二重処理防止
ロック競合
対処方法スキップして次回に処理
結果データ整合性維持

監視とアラート

問題の早期発見のため、以下の監視を行っています:

定期チェック項目

  • トークン有効期限 - 30日未満で警告、7日未満でアラート
  • 処理失敗率 - 一定以上の失敗が続いたら通知
  • 未処理注文 - 長時間処理されない注文があれば警告

アラート通知

問題が発生した場合、管理画面にアラートを表示します。アラートには以下の情報が含まれます:

  • 発生日時
  • 問題の種類
  • 影響範囲
  • 推奨される対処法

標準連携との違い

エラーハンドリング
標準連携ブラックボックス
本システム明示的に設計・実装
重複防止
標準連携内部処理
本システム冪等性キーで管理
ログ
標準連携確認困難
本システム詳細に記録・検索可能
トークン管理
標準連携自動(詳細不明)
本システム自動更新・フォールバック

メリット

この設計により、以下のメリットが得られました:

  • 自動復旧 - 多くの問題は自動的に回復
  • 可視化 - 問題発生時は即座に把握可能
  • データ保全 - 二重処理やデータ欠損を防止
  • 安心運用 - 「いつの間にか止まっていた」がない

運用のコツ

定期的なログ確認

問題が発生していなくても、週に1回程度はログを確認することをお勧めします。警告レベルの問題が蓄積していないか確認できます。

トークンの手動更新

自動更新が何らかの理由で失敗し続ける場合は、手動でトークンを再発行して設定することもできます。

エラー時の対応

エラーアラートが出た場合は、まずログで詳細を確認します。多くの場合、一時的な問題で自動回復していますが、継続する場合は根本原因の調査が必要です。

関連記事