概要
- 3度にわたり異なる会社・プロバイダーで同じ「データ同期システム」を構築
- Webhookによる通知ベースのデータ同期の限界と運用負荷を実体験
- 通知(Webhook)はデータ転送には本質的に不向き
- 「順序性・完全性・検証性」を満たす設計への進化の必要性
- ログの直接的な取得(Pull型)へのパラダイムシフト提案
3度目のシステム構築体験
-
3社で同じ「顧客データ同期システム」 を構築した経験
-
顧客情報は外部プロバイダー(Identity Provider、Stripe等) のDBに分散管理
-
Webhook購読でローカルにコピー を保持する運用
-
初回は「エンドポイント1つで済む」と考えたが、実際は複雑化
- 署名検証 の実装(セキュリティ対策)
- 重複配信対策(dedupテーブル) の導入
- 順序ズレ対応のバッファ 設計
- 初期データ取得(Bootstrap Importer) とライブイベントの競合対策
- 定期的な整合性チェック(Reconciliation Cron) の実装
-
Cronジョブは「自分のコピーを信用できない」証拠 として毎晩再構築
Webhook運用の本質的な課題
- データの不整合やロストはサイレントに発生 し、サポート問い合わせで発覚
- 各プロバイダーごとに管理画面・Webhook設定・署名方式が異なる 運用負荷
- デバッグ時は複数タブで各種ログを横断的に確認 する必要
通知はデータではない
- Webhookは「何かが起こった」通知 であり、 データ転送には不向き
- 順序保証・完全性・検証性・初期同期 など、Webhookが持たない重要要件
- 本来の履歴(Ordered Log)はプロバイダー内に存在 するが、 分割・順不同・欠損・重複 で通知される
- 「パズルのピースを郵送で受け取る」ような再構築作業 の比喩
Webhook利用の歴史と現状
- Webhookは2007年の誕生当初は副作用トリガー用途 (CIビルドや領収書メール等)
- 「データ同期」用途への拡張で不整合が顕在化
- 業界全体が「安易な選択肢」に15年かけて複雑なワークアラウンドを積み上げた現状
業界の最適化の罠(ローカルオプティマム)
- Webhook周辺のエコシステム (Svix、Hookdeck、AWS EventBridge等)の発展
- 本質的な課題解決ではなく「谷底の快適化」 に留まっている現状
- ログAPIを提供するStripeやWorkOSのような進化例 も登場
理想的な設計への提案
-
必要な要件:順序性、初期同期、削除検知、再開性、検証可能性
-
WebhookやリストAPIの強化では限界
-
プロバイダーが「変更ログ(Ordered Change Log)」を直接提供し、 クライアントがPull型で取得する設計 への転換
- GET /feed/customers?cursor=xxxx のようなAPI
- 全イベントが順序付き・カーソル管理 で取得可能
- 重複排除・順序バッファ・初期インポート不要
- 削除も「削除イベント」として明示
- 接続はクライアント発、署名・トンネル等も不要
- 検証用のハッシュや件数もAPIで取得可能
まとめ
- Webhook通知によるデータ同期は設計的に限界
- 「Ordered Logの直接取得」こそが本質的な解決策
- 進化したAPI設計と共通契約の業界標準化が今後の課題
- 一時的な快適さよりも、根本的な設計変更の必要性