Upgrade to Pro — share decks privately, control downloads, hide ads and more …

アクターシステムに頼らずEvent Sourcingする方法について

アクターシステムに頼らずEvent Sourcingする方法について

イベントソーシングやCQRSパターンの実装では、しばしばアクターモデル(Akka/Pekkoなど)が用いられますが、本セッションではそれに頼らない実装方法を解説します。Amazon DynamoDBを使ったイベントストアの実装方法を中心に、実際のコードを交えながら説明します。

かとじゅん

December 21, 2024
Tweet

More Decks by かとじゅん

Other Decks in Programming

Transcript

  1. 自己紹介 Kubell 社( 旧Chatwork 社) テックリード。 ウェブ業界に転身後、Scala やDDD を採用した開発に従事。現在は次 期アーキテクチャの設計に携わる

    → 次あります 執筆 プロダクトデザインやソフトウェア設計の本を書いてるけどいつ 出るか… レビュー 改訂版 良いコード/悪いコードで学ぶ設計入門 WEB+DB PRESS Vol.132 - 特集1 オブジェクト指向神話からの脱 却 ドメイン駆動設計入門 Akka 実践バイブル エリックエヴァンスのドメイン駆動設計 twitter: j5ik2o github: j5ik2o
  2. 想定のシステム構成 集約はドメインモデルの集合体 コマンドを受け付け、状態遷移する(状態機 械) 更新のための状態は保持できるが閲覧はできな い コマンドに成功するとイベントを送出する 集約そのものではなくイベントが永続化される 集約という単位でオブジェクトグラフを手にで きる

    DB とは直接関係ないのでインピーダンスミス マッチも解決しない( 関係があるのはイベント の方) 集約をアクターという軽量プロセスで実現するのが一般的。今日はその集約をクラスベースで実現する方法に ついて考える。
  3. アクターモデルを使わなくても実現は可能 ただし、イベントストアをどのように実現するかという課題がある。 ヒントは以下。AWS さんのドキュメント。 Amazon DynamoDB を使った CQRS イベントストアの構築 AWS

    データベースブログの記事 「Amazon DynamoDB による CQRS イベントストアの構築」 を勝手に読み解 く なぜDynamoDB なのだろうか?→ CDC が比較的容易にできるNoSQL だから
  4. 【AWS 方式】 テーブル構成 Aggregate (集約) :ビジネスロジックの実装をカプセル化するCQRS パターン Event :何かが起こったことを示すイベント Snapshot

    :特定の時系列ポイントまでに起こったイベントから導出された状態を示すスナップショット。 スナップショットを使うとランタイムで全てのイベントの履歴を保持したりロードしたりする必要がなくな ります。
  5. 【AWS 方式】 集約を読み込むロジック Aggregate テーブルを読む last_events があればEvent テーブルに書き込む。CQS 違反?? その後Snapshot

    テーブルを読み、Event を読む last_events はEvent テーブルに追記するだけではなくAggregate からlast_events を消さないといけない。Event へのPutItem と同時に行わないと安全とは言えないのでは??結局トランザクションが必要では??
  6. 【KJ 】Journal テーブルはSnapshot,Journal の二つ pkey パーティションキー ${ 集約種別名}-${hash( 集約ID) %

    論理シャードサイズ} skey ソートキー ${ 集約種別名}-${ 集約ID の値部分}-${ シーケンス番号} aid: 集約ID seq_nr: シーケンス番号 payload: イベント本体 occurred_at: 発生日時 ` ` ` `
  7. 【KJ 】Snapshot pkey パーティションキー ${ 集約種別名}-${hash( 集約ID) % 論理シャードサイズ} skey

    ソートキー ${ 集約種別名}-${ 集約ID の値部分}-${ シーケンス番号} 。最新のスナップショットはシーケンス番号=0 aid: 集約ID seq_nr: シーケンス番号 ttl: 削除のためのTTL version: 楽観的ロック用のバージョン ` ` ` `