Slide 1

Slide 1 text

RustでCQRS+ESを勉強 してみた話 イベントソーシング・CQRS勉強会 #1 榊崎リシェラ

Slide 2

Slide 2 text

・矢原一樹 a.k.a 榊崎リシェラ ・X: @RechellaTek ・フリーランス ・Rust / Java ・CQRS+ESを学び始めて1年ぐらい Profile

Slide 3

Slide 3 text

§1. CQRS+ESを実践するにあたって失敗したこと §2. Rustで段階的にCQRS+ESの実装をしてみる §3. まとめ 本日の話題

Slide 4

Slide 4 text

§1. CQRS+ESを実践するにあたって失敗したこと

Slide 5

Slide 5 text

CQRS+ESの出会い ActivityPubというプロトコルを利用したSNSの開発中、大量のレポジトリ が出来上がってCRUD操作がかなり辛くなった。リポジトリの他に案はな いのかと調べているとCQRS+ESに行き着いた 概念は非常にシンプルで、Scalaのサンプルを動かしたりしているうちに 理解が進んだが… §1. CQRS+ESを実践するにあたって失敗したこと

Slide 6

Slide 6 text

CQRS+ES、仕組みは理解できたけど どうやって実装すればいいのか全く分からない…

Slide 7

Slide 7 text

Xで投稿すると… DynamoDBやCosmosDB等を使った方法 アクターモデルを使った方法 CDC+Outboxを使った方法 etc… §1. CQRS+ESを実践するにあたって失敗したこと

Slide 8

Slide 8 text

アクターモデルを使った方法が良さそう

Slide 9

Slide 9 text

なんやかんやあって失敗… アクターモデルを使ったライブラリを再現しようとした → 何を血迷ったのか既存のライブラリ(例えばAkka)を完全再現しよ うとして本筋から外れて勝手に爆発 なんで踏みとどまらなかったんや… CQRS+ESの知識を深めるよりも先にモデルを導入しようとした → 集約のルールやコマンド、イベントがめちゃくちゃになって プロジェクトを爆破 §1. CQRS+ESを実践するにあたって失敗したこと

Slide 10

Slide 10 text

§1. CQRS+ESを実践するにあたって失敗したこと 総じて… 全体的な知識不足 CQRS+ESを実現するために必要な技術 を考えてから実装するべきだった

Slide 11

Slide 11 text

§2. Rustで段階的にCQRS+ESの実装をしてみる 書き込みのロジック編(CQRS+ES)

Slide 12

Slide 12 text

一旦愚直にコードに起こしてみる

Slide 13

Slide 13 text

https://github.com/HalsekiRaika/cqrs-es-playground 最初の一歩 fn(&Entity, Command) -> Result を意識してuser.handle(input)でイベントを生成して、 user.apply(event)でイベントをデータに適用している 様々な場所で挙げられている通り、イベントのリプレイ が出てくると、リクエスト毎にデータがリプレイされる ことになるためパフォーマンスがかなり悪くなる。 §2. Rustで段階的にCQRS+ESの実装をしてみる

Slide 14

Slide 14 text

https://github.com/HalsekiRaika/cqrs-es-playground User集約に全てがハードコードされている handleは集約の不変参照を使って、コマンドを イベントに変換している applyで始めて可変参照を使って、イベントから データを変更している Command Entity Event handle apply 不変 可変 EventStore §2. Rustで段階的にCQRS+ESの実装をしてみる

Slide 15

Slide 15 text

§2. Rustで段階的にCQRS+ESの実装をしてみる 汎化 大分見通しが良くなった https://github.com/HalsekiRaika/cqrs-es-playground

Slide 16

Slide 16 text

§2. Rustで段階的にCQRS+ESの実装をしてみる Command Entity Event handle apply 不変 可変 EventStore https://github.com/HalsekiRaika/cqrs-es-playground

Slide 17

Slide 17 text

§2. Rustで段階的にCQRS+ESの実装をしてみる 処理が終わると データは解放されてしまう 見逃せない問題 「リクエスト毎にイベントをリプレイして 最新の状態を作り上げてしまう」 _人人人人人人人人人_ > CRUDよりひどい <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄ https://github.com/HalsekiRaika/cqrs-es-playground

Slide 18

Slide 18 text

§2. Rustで段階的にCQRS+ESの実装をしてみる 状態 Actor 「A」 Actor 「…」 MailBox 伏線回収

Slide 19

Slide 19 text

§2. Rustで段階的にCQRS+ESの実装をしてみる 軽量プロセスの導入 https://github.com/HalsekiRaika/cqrs-es-playground

Slide 20

Slide 20 text

§2. Rustで段階的にCQRS+ESの実装をしてみる 軽量プロセスの導入 Receptor::handle(&self, Command) を使うことでコマンドを送信してイベント が貰えるようになった。 Receptor::apply(&self, Event) でイベントを送信して内部状態を更新する ことができるようになった。 Receptor::entrust(&self, Command) でコマンドを送信してそのまま内部状態を 更新することができるようになった。 これだけ特殊でコマンドを送る処理だけし か止まらない。 https://github.com/HalsekiRaika/cqrs-es-playground

Slide 21

Slide 21 text

§3. まとめ

Slide 22

Slide 22 text

§3. まとめ • 失敗点から手法を見出すことができた • アクターモデルを参考にした軽量プロセスによるリプレイ の削減を思いついた

Slide 23

Slide 23 text

ご清聴ありがとうございました!!!