DOCUMENTATION / ARCHITECTURE
Architecture
SyncCoordinatorは、Web、Worker、管理DBの3つで構成されます。Webで設定した内容をWorkerが読み取り、業務DB間を同期します。処理状態は管理DBに保存します。
OVERVIEW
全体構成
SyncCoordinatorは業務システムとは別に配置します。Webは設定と管理、Workerは同期処理、管理DBは設定と処理状態の保存を受け持ちます。
コンポーネントの役割
Coordinator Web
管理画面と管理者認証を提供します。接続先、同期ルール、マッピングの編集と、DB配備用SQLの生成・検証を行います。同期処理は実行しません。
Coordinator Worker
管理DBから設定を読み、変更の取得、競合判定、送信先への適用を繰り返します。Webhook配送と管理DBのクリーンアップも行います。
Coordinator 管理DB
接続情報、同期ルール、マッピングを保存します。Checkpoint、Inbox、Snapshot、競合履歴など、再開に必要な状態もここに残します。
SYNC RULES AND MAPPING
同期ルールとマッピング
同期ルールには、送信元、送信先、方向、競合時の扱いを設定します。テーブルや列の違いは、ルールに紐づくマッピングで指定します。
DIRECTION
片方向と双方向
- 片方向送信元から送信先への変更だけを処理します。
- 双方向送信元から同期されたレコードが送信先で更新された場合、その変更を最初の送信元へ戻します。
- ループ防止最初の発生元と適用済みMessage IDを記録し、SyncCoordinator自身が反映した変更を再送しません。
MAPPING
テーブル・列・値の対応
- テーブルとキー両端のschema、table、レコードを識別するキー列を指定します。
- 列と型列の対応、NULL可否、文字列長、数値のprecision/scaleを保存します。
- 値変換コード値の変換、日時の正規化、方向別の固定値を設定できます。
CONFLICTS AND NOTIFICATIONS
競合と通知
競合の処理と外部通知はWorkerが行います。判定結果と通知の配送状態は管理DBに保存され、管理画面から確認できます。
CONFLICT
競合した場合
- 競合を検知前回のSnapshot、受信した値、送信先の現在値を比較します。両側で同じ項目が変更され、値が異なる場合を競合として扱います。
- ポリシーを適用同期ルールに従い、受信値を採用する、送信先の値を残す、保留する、マージする、のいずれかを選びます。
- 必要なら管理画面で解決保留した競合は管理画面に表示します。選択後、Workerが送信先の値を確認し直してから反映します。
NOTIFICATION
通知の流れ
- イベントを保存競合検知や同期エラーが発生すると、通知イベントを管理DBのOutboxへ保存します。
- Webhookへ送信WorkerがOutboxを読み、登録済みのWebhookへ非同期で送信します。現在の通知先はWebhookです。
- 失敗時は再試行Webhookの配送に失敗した場合は間隔を空けて再試行します。通知の失敗で同期処理は停止しません。
BUSINESS DATABASE BOUNDARY
業務DBへの配備
業務DBには、変更検知と重複適用防止に使う補助オブジェクトを追加します。既存のアプリケーションコード、業務テーブル、業務列は変更しません。
DEPLOYED OBJECTS
- SyncChangeQueue
- SyncAppliedMessage
- SyncEntityOrigin
- SyncDeleteTombstone
- SyncCoordinatorDeployment
- 対象テーブルの変更検知Trigger
UNCHANGED
- 既存の業務アプリケーション
- 既存の業務テーブル
- 既存テーブルの業務列
設定の保存時にはDDLを実行しません。生成されたSQLをDBAが確認・実行し、配備内容の検証が終わってから同期ルールを有効にします。
初期データについて:SyncCoordinatorは配備後の変更を同期します。既存データの一括移行や全件比較は行わないため、同期を有効にする前に別の手段で初期データを揃えてください。
STATE AND RELIABILITY
状態管理と再実行
業務データは各業務DBに残し、同期設定と処理状態はCoordinator管理DBに保存します。Worker自身は永続状態を持たないため、停止しても保存済みの位置から処理を再開できます。
| 保存場所 | 主な状態 | 役割 |
|---|---|---|
| Coordinator管理DB | SystemDefinition、同期ルール、マッピング、Checkpoint、Inbox、Snapshot、競合・監査・運用履歴 | 設定と処理状態の正本です。Workerは再起動後、この状態を読み直して処理を再開します。 |
| 業務DB | 業務レコード、変更Queue、適用済みMessage、Origin、削除Tombstone、配備ハッシュ | 現在の業務データと、変更検知・重複適用防止に使う補助状態を保持します。 |
再起動と再送への対応
送信元ごとに最後に処理したQueueIdを保存します。処理に失敗した場合、その送信元の位置は進めません。
配送状態をProcessing、Completed、Held、Failedで保存します。処理中に停止した場合は、リース失効後に同じ配送を取得し直します。
配送ごとに同じIDを生成し、送信先のSyncAppliedMessageへ記録します。同じ配送が再実行されても二重に反映しません。
SyncChangeQueueは変更後の値そのものではなく、「このレコードが変わった」という通知を保持します。再開時には対象レコードを読み直し、その時点の最新状態を同期します。
IMPLEMENTATION DETAILS
実装の詳細
実装と本番配備に関係する補足です。必要な項目を開いて確認してください。
プロジェクトの依存方向
同期処理はCoreに置きます。Webは業務DB Connectorを直接実行しません。WorkerがCoreを呼び出して同期を進めます。
Contracts ← Core ← Infrastructure ← Worker
↑
└──────────── Web
ServiceDefaults ← Worker / Web
AppHost ─────────→ Worker / Web / demo resources設定変更が反映されるタイミング
- 周期開始Workerが処理用のscopeを作ります。
- 接続先を取得有効なシステム定義と接続情報を管理DBから読みます。
- 同期を実行同じ周期の途中では接続先を切り替えません。
- 次周期設定変更はWorkerを再起動せず、次の周期から反映されます。
暗号鍵とDB権限
業務DBの接続文字列とWebhookの署名鍵は、Data Protectionで暗号化して管理DBへ保存します。
WebとWorkerを別ホストに置く場合は、両方から読める共有Key Ringを用意し、ACLで保護します。
Workerが通常運用で使う読書き権限と、補助オブジェクトを作成するDDL権限は分けます。
NEXT
