Skip to content

Latest commit

 

History

History
49 lines (35 loc) · 11.1 KB

File metadata and controls

49 lines (35 loc) · 11.1 KB

EventStoreが利用するDynamoDBのテーブル構成

  • Journal
  • Snapshot

いずれのテーブルも、キー設計の前提としては、論理シャード内で最大限に書き込みが分散させることを想定しています。

Journalテーブル

集約で起きたイベントを保存するためのテーブル。原則的に、このイベントを使って集約状態を再生(リプレイ)します。

キー名 説明 具体的な値 備考
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が適用されており、リプレイ時はこのインデックスを利用されます。

Snapshotテーブル

集約の状態を保存するためのテーブルであり、集約のリプレイを高速化するためのテーブルです。スナップショット保存後にもイベントは保存されるため、最新の集約状態を表さない場合あります。

キー名 説明 具体的な値 備考
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が適用されており、リプレイ時はこのインデックスを利用されます。

イベント及びスナップショットの書き込み

  1. 集約にてコマンドが受理されると、最新のseq_nrが付与されたイベントが生成されます。
  2. 生成されたイベントはjournalテーブルに書き込まれます。ただし、この書き込みは必ずsnapshotテーブルと同じトランザクションで行われ、versionが一致する条件下で実施されます。初回のイベント以外は、snapshotのpayloadを更新することはオプションです。

イベント及びスナップショットを使って集約をリプレイする

  1. 集約のIDを指定して、スナップショットを取得します。
  2. 取得した集約のIDとスナップショットのシーケンス番号以降のイベントをjournalテーブルから読み込みます。
  3. 読み込んだイベントをスナップショットに適用することで、最新の集約状態を取得します。