仕組みと日常運用
ブリッジのペアリングが完了して同期が有効になると、あとは自動的に動作します。このページでは、実際に何が行われているのかを説明します。何かおかしいと感じたときに、当てずっぽうではなく、どこを見ればよいかがわかるようになります。
同期エンジンをわかりやすく解説
1. 変更がイベントを発生させる
WHMCS内の関連するすべての変更は、WHMCSのフックを発火させます。クライアントの追加や編集、コンタクトの作成、請求書の確定、支払いの着金、注文の発生、サービスのプロビジョニングや一時停止、チケットの起票や返信などが該当します。
フックはHTTP通信を行いません。小さなイベントをアウトボックステーブル(mod_perfexbridge_outbox)へ書き込み、即座に処理を返します。
WHMCSのフックがPerfexを直接呼び出していた場合、Perfexサーバーの応答が遅かったり到達できなかったりすると、WHMCSの管理ページや顧客のチェックアウトがブロックされてしまいます。ローカルのテーブルへの書き込みは1ミリ秒で完了し、他者のネットワーク事情で失敗することはありません。それ以降の処理はすべてバックグラウンドで行われます。
2. cronがキューを処理する
WHMCSのシステムcronが実行されるたびに、ディスパッチャーはアウトボックスから処理対象のイベントをバッチで取り出し、それぞれをHTTPSでPerfexインストール環境へPOSTします。
各リクエストは、JSONボディに加えて2つのヘッダーを持ちます。タイムスタンプと、そのタイムスタンプおよびリクエストボディそのものに対して共有シークレットで計算したHMAC-SHA256署名です。Perfexは自身が保持するシークレットで署名を再計算し、一致しないもの、またはタイムスタンプが300秒を超えて古いものを拒否します。
WHMCSのモジュールページのRun Sync Nowを使えば、いつでも即座にキューの処理を実行できます。
3. 失敗は再試行され、その後デッドレターになる
送信に失敗したイベントは失われませんし、短い間隔で再試行され続けることもありません。指数バックオフでスケジュールし直されます。最初の失敗からおよそ60秒後、次は2分後、4分、8分と延びていき、試行間隔の上限は6時間です。
15回の試行後、期間にしておよそ40時間が経過すると、その行はdeadとしてマークされます。dead状態の行が自動的に再試行されることはなく、自動削除されることもありません。これがデッドレターの保管場所です。WHMCSのモジュールページ上部のDead eventsカウンターが件数を示し、ログの行がその理由を示します。
デッドレターになったということは、同じイベントが同じ理由でほぼ2日間失敗し続けたということです。原因はほぼ必ず次の4つのいずれかです。Perfexに通貨が登録されていない、シークレットが一致していない、FreeプランがProのイベントをブロックしている、Perfexがオフラインである、のいずれかです。原因を解消してから、その処理を再度キューに入れてください。トラブルシューティングをご覧ください。
4. 一時停止しても何も失われない
Enable Syncのチェックを外すと、一時停止するのは配信だけです。フックはアウトボックスへイベントを書き込み続けるため、停止中も失われるものはありません。再度有効にすると、次の実行タイミングで滞留分が処理されます。Run Sync Nowを使えば即座に処理できます。
5. エコー抑止が無限ループを防ぐ
双方向同期には明白な危険が伴います。WHMCSがPerfex由来の変更を適用すると、その書き込みがWHMCS自身のフックを発火させ、変更がそのまま戻ってしまうという問題です。何も対策しなければ、1件の編集が永遠に往復し続けます。
ブリッジは、両側で適用される多層的なガードによってこれを防いでいます。
- リクエスト内の発生元フラグ。 ブリッジが受信した変更を適用している間に設定され、ブリッジ自身による書き込みが新しいユーザー編集として扱われないようにします。
- エンティティおよび返信IDのマップ参照。 ブリッジが作成したばかりのチケット返信を正しく認識し、新規として再送しないようにします。
- チェックサムの比較。 デ ータが最後に同期された状態と既に一致している場合、そのイベントを何もしない処理へと変えます。
各側が独自の発生元フラグを持ち、フラグが何らかの理由で機能しなかった場合の最後の砦としてチェックサムが働きます。これらのガードは意図的にフェイルオープンで設計されています。判断がつかない場合は、更新が黙って失われるよりも、無害な送信が1回余分に行われるほうを選びます。
6. ハウスキーピング
両側とも、24時間に1回を上限とする自己制御型の日次クリーンアップを実行します。
- 配信済みのアウトボックスの行は、7日を過ぎたものが削除されます。
- ログの行は、90日を過ぎたものが削除されます。
- pendingとdeadの行は削除されません。 pendingは未配信の処理であり、deadはデッドレターの保管場所だからです。