DynamoDBによるOutboxパターンとCDCを用いたCQRSアーキテクチャ
アーキテクチャの工夫ポイント
アーキテクチャ選択の背景や意図
実店舗在庫確認・取り置きサービスではCQRSアーキテクチャを採用しました。
コマンド(書き込み)側DBにDynamoDB、クエリ(読み取り)側DBにAurora MySQLを用い、両DBの同期にはOutboxパターンと変更データキャプチャ(CDC)を組み合わせることで、二重書き込みの整合性問題を回避しています。
具体的には、DynamoDBのトランザクション機能を利用して「集約ステート」と「ドメインイベント」のテーブルに書き込みし、CDC(Kinesis Data Streams for DynamoDB)でイベントをキャプチャしてクエリ側DBや他サービスへ通知します。
Kinesisの順序保証がない点に対しては、イベントにバージョン番号を付与して対応しています。
また、イベントのスキーマ定義には Protocol Buffers を用いることで、サービス間の疎結合と拡張性を確保しました。
この設計によりAkkaなどの特別なフレームワークを使わずにCQRSを実現し、データ不整合リスクの抑制を達成しています。
詳細は以下の資料をご参照ください。
https://techblog.zozo.com/entry/implementation-of-cqrs-using-outbox-and-cdc-with-dynamodb
https://speakerdeck.com/mokamoto12/dian-pu-zai-ku-lian-xi-nocqrswozhi-erumetusezinguzhou-rinoji-shu
現在の課題と今後の改善予定
本アーキテクチャでは、高い書き込みスループットと、CDCを第一級でサポートする利点に着目し、DynamoDBをメインのDBに採用しました。
DynamoDBのマルチオブジェクトトランザクション機能を利用することで、Outboxパターンの原子性を確保し、安全なメッセージングを実現しています。
しかし、DynamoDB単体では複雑な集計クエリを効率的に捌けないため、クエリ側DBを導出データシステムとして追加構築しました。
現時点では大きな問題となっていませんが、データ反映が結果整合性となることで、ユーザーが書き込み直後に古いデータを参照するリスクを内包しています。
また、システム全体の複雑度も高まっています。
この課題を解決する手段として、線形化可能性を持ち、高い書き込みスループット・CDC・マルチオブジェクトトランザクション・効率的な集計クエリの処理を統合的にサポートするDBへの移行も選択肢となり得ます。
これにより、コマンドとクエリで分割されたデータストア構造を簡素化し、データ整合性の課題をアプリケーション層からDB層へ委譲することで、システムの信頼性向上に貢献すると考えられます。
◆X:@zozotech
Speaker Deck:https://speakerdeck.com/zozotech
アーキテクチャを構成するツール
会社情報

株式会社ZOZO
従業員規模 1,001〜5,000名
エンジニア組織規模 501名〜1,000名
ファッションEC「ZOZOTOWN」、ファッションコーディネートアプリ「WEAR」など各種サービスの企画・展開をおこなうほか、「ZOZOSUIT」「ZOZOMAT」「ZOZOGLASS」などの計測テクノロジー開発・活用にも取り組んでいます。