- Journal
- Snapshot
いずれのテーブルも、キー設計の前提としては、論理シャード内で最大限に書き込みが分散させることを想定しています。
集約で起きたイベントを保存するためのテーブル。原則的に、このイベントを使って集約状態を再生(リプレイ)します。
| キー名 | 説明 | 具体的な値 | 備考 |
|---|---|---|---|
| pkey | パーションキー(集約種別名-hash(集約ID) % 論理シャードサイズ) | user-account-1 | |
| skey | ソートキー(集約種別名-集約IDの値部分-シーケンス番号) | user-account-01H42K4ABWQ5V2XQEP3A48VE0Z-12345 | |
| aid | 集約ID | user-account-01H42K4ABWQ5V2XQEP3A48VE0Z | |
| ser_nr | シーケンス番号(開始番号は1) | 12345 | |
| payload | イベント内容 | {"type":"Created","id":"01H42KBHCW1BZG504J4ZXKA2F2","aggregate_id":{"value":"01890535-c59c-72d5-08a8-dcea316374c8"},"seq_nr":1,"name":"test","members":{"members_ids_by_user_account_id":{"01H42KBHCWBDTZYQ7P78T8BTWX":"01H42KBHCWA8NE32M49YH544H1"},"members":{"01H42KBHCWA8NE32M49YH544H1":{"id":"01H42KBHCWA8NE32M49YH544H1","user_account_id":{"value":"01890535-c59c-5b75-ff5c-f63a3485eb9d"},"role":"Admin"}}},"occurred_at":"2023-06-29T03:32:37.404481Z"} | |
| occurred_at | 発生日時 | 2023-06-29T03:32:37.404481Z |
aidとseq_nrはGSIが適用されており、リプレイ時はこのインデックスを利用されます。
集約の状態を保存するためのテーブルであり、集約のリプレイを高速化するためのテーブルです。スナップショット保存後にもイベントは保存されるため、最新の集約状態を表さない場合あります。
| キー名 | 説明 | 具体的な値 | 備考 |
|---|---|---|---|
| pkey | パーションキー(集約種別名-hash(集約ID) % 論理シャードサイズ) | user-account-1 | |
| skey | ソートキー(集約種別名-集約IDの値部分-シーケンス番号), 最新のスナップショットはシーケンス番号=0として読み書きされます。 | user-account-01H42K4ABWQ5V2XQEP3A48VE0Z-12345 | |
| payload | 集約の状態 | {"id":{"value":"0189053a-d0b4-8f9b-4fb6-db91f72ccf16"},"name":"test","members":{"members_ids_by_user_account_id":{"01H42KNM5MBVRBZTADAZ9ETSPZ":"01H42KNM5M2QEW700VCW4J2KYE"},"members":{"01H42KNM5M2QEW700VCW4J2KYE":{"id":"01H42KNM5M2QEW700VCW4J2KYE","user_account_id":{"value":"0189053a-d0b4-5ef0-bfe9-4d57d2ed66df"},"role":"Admin"}}},"messages":[],"seq_nr_counter":1,"version":1} | |
| aid | 集約ID | user-account-01H42K4ABWQ5V2XQEP3A48VE0Z | |
| ser_nr | シーケンス番号(開始番号は1) | 12345 | |
| ttl | 削除のためのTTL(秒) | 1624980000 | |
| version | バージョン(楽観的ロック用)(開始番号は1) | 1 |
- スナップショット冗長化機能が無効な場合はskey=0にスナップショットが保存されるだけですが、有効にした場合はスナップショットはskey=0以外にskey=aggregate.seq_nr()の2件保存されます。スナップショットを保存するたびにskey=aggregate.seq_nr()のスナップショットが増えますが、あなたはスナップショットは上限を指定できます(デフォルトは1)。上限を超えた場合は古いスナップショットから削除されます。デフォルトでは、クライアント主導で削除されます。TTLを使ってDynamoDB自身に削除させることもできます。
- aidとseq_nrはGSIが適用されており、リプレイ時はこのインデックスを利用されます。
- 集約にてコマンドが受理されると、最新のseq_nrが付与されたイベントが生成されます。
- 生成されたイベントはjournalテーブルに書き込まれます。ただし、この書き込みは必ずsnapshotテーブルと同じトランザクションで行われ、versionが一致する条件下で実施されます。初回のイベント以外は、snapshotのpayloadを更新することはオプションです。
- 集約のIDを指定して、スナップショットを取得します。
- 取得した集約のIDとスナップショットのシーケンス番号以降のイベントをjournalテーブルから読み込みます。
- 読み込んだイベントをスナップショットに適用することで、最新の集約状態を取得します。