Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
RailsでCQRS/ES をやってみた気づき 鈴木まー イベントソーシング・CQRS勉強会 #1
Slide 2
Slide 2 text
自己紹介 鈴木まー Railsの特性を活かしつつ、拡張性と 保守性を両立する設計を探求中。 DDDやモジュラーモノリスを実践し てきて、Rails + クリーンアーキテク チャのLT経験あり。最近はRailsに CQRS/ESを適用する方法を模索し てる 千葉県で設計に ついて登壇を している 船橋.dev 東葛.dev
Slide 3
Slide 3 text
なんで RailsでもCQRS/ESを するのか?
Slide 4
Slide 4 text
なんで RailsでもCQRS/ESを するのか? イベントソーシングを おこないやすくするため
Slide 5
Slide 5 text
履歴を保持することで 過去の状態を 正確に再現できる 外部システムとの連携時も 状態を 追跡しやすく、再現性が高まる コマンドとクエリーを分離することで スケールしやすい設計が可能になる イベントソーシングのメリット
Slide 6
Slide 6 text
イベントソーシングは、プログラミング言語 を問わず、システムの過去の状態を正確に再 現できる仕組み Railsでも適用でき、特にコアドメインが複 雑なシステムでは、データの履歴を追跡しや すく、バグの特定や状態の復元が容易になる Railsでもイベントソーシングは有効
Slide 7
Slide 7 text
実際に鈴木がRailsのプロダクトで CQRS/ESをしてみると良かったなと 思った過去の事例
Slide 8
Slide 8 text
実装をした機能 UberEatsなど、複数の配送サービスAPIを統合し 配達者にとって最適な配送手段を選択して自動手配 するサービスを開発する 仕様 1. ユーザーが配送条件を入力 2. システムが最適な配送サービスを選択 3. 選択した配送サービスへ正式な注文を送信 4. 配送の進行状況を記録
Slide 9
Slide 9 text
配送サービスAPIは独自に開発してもらっている ものだから不安定 開発してもらたAPIがバグでエラーになったのか、 プロダクト側で失敗した理由かがわからない 「現在の状態」はわかるが、いままでどのよなことを してその状態(配送中とか)になったのかがわからない システムを動かすためには作成してもらった APIを動かす必要があるがその連携がたいへん APIを作ってもらった会社に連絡をする必要がある 問題点
Slide 10
Slide 10 text
複雑な機能は多くのプロダクトで発生し、 イベントソーシングはそれを適切に管理する強力な手法 システムの状態変化を履歴として記録し、 過去のプロセスを再現できる エラーの発生箇所や原因を正確に追跡できる ビジネスルールの変更にも柔軟に対応し、長期的な拡張性を確保 イベントソーシングを使う事によるメリット
Slide 11
Slide 11 text
イベントソーシングは 重要なのわかったけど、 実際にRailsでどう 実装していくの?
Slide 12
Slide 12 text
DDD/EAが盛んなEUで導入されている リポジトリのStar数が1.4k 機能面 Hexagonalアーキテクチャで外部依存を分離し、 ActiveRecordのコールバックを排除。 疎結合なイベント駆動の連携・副作用の分離・完全な履歴管理により、 拡張性の高い、スケールしやすく安定したシステムを構築しやすい https://railseventstore.org/ Rails Event StoreというGemがある
Slide 13
Slide 13 text
ESについて理解していない状態でこのライブラ リーをしようするのはおすすめしない 挫折する理由になってしまう
Slide 14
Slide 14 text
従来のCRUDとは異なるパターンのため、単にライブラ リを使うだけでは、内部で何が起こっているのかを正し く理解することは難しい。 このライブラリを利用する場合でも、CQRS/ESの独特 な実装パターンを把握し、EventStoreやEventBusなどの 仕組みを理解することが重要になる。
Slide 15
Slide 15 text
難しいので、挫折しそうだけど、最初はなにを じっそうするといいのか?
Slide 16
Slide 16 text
難しいので、挫折しそうだけど、最初はなにを じっそうするといいのか? 最初は同期処理のスクリプト(rake)でユーザー からの入力を受け取りそれをイベントとして記録 するだけのものを作るのがおすすめ
Slide 17
Slide 17 text
同期処理がいい理由 通常CQRS/ESは非同期処理で実装をするが、普段はRESTAPIなど の同期処理のプログラミングスタイルをしている人にとっては、 何がいつ実行されているのかが分かりづらくなる。 また非同期処理は実装が複雑になりやすい。 そのため、まずは同期処理で動作を理解する
Slide 18
Slide 18 text
スクリプトがいい理由 Webアプリとして作ると、フロントエンドやAPIの設計が絡み、 CQRS/ESの本質を理解する前に「どうリクエストを受けるか?」 といった別の課題に直面しがち。 スクリプトなら、「コマンド → ハンドラー → イベント発生 → 状 態更新」だけにフォーカスできるため、CQRS/ESの構造を最小限 の実装で学べる。
Slide 19
Slide 19 text
CQRS/ESの簡単なスクリプトの例
Slide 20
Slide 20 text
No content
Slide 21
Slide 21 text
Railsで実装するとき にしっておいたほう がいいこと
Slide 22
Slide 22 text
EventStoreはActiveRecordで問題ない PostgreSQL や MySQL の JSON カラムを活用すれ ば、イベントデータを柔軟に格納できるため、普段 使い慣れている ActiveRecord で実装できる 一方で、MongoDB など普段使い慣れていないデー タベースを導入すると、新しい手法を学びながら、 さらに別の新しい技術にも適応する必要があり、挫 折しやすくなる
Slide 23
Slide 23 text
従来の実装では、データベースの処理は通常、一つのトラ ンザクションにまとめてSQLを実行する しかし、CQRS/ESでは、イベント登録とクエリーの更新 を同じトランザクションで行うのは 一貫性の問題が発生す るため、明確なアンチパターンとなる イベント登録とクエリーの更新を同じ トランザクションではしていはいけない
Slide 24
Slide 24 text
Railsで同期的なPub/Subをするには ActiveSupport::Notificationsがつかえる 通知 Publish Subscribe
Slide 25
Slide 25 text
まとめ RailsでもESで実装をするとコアドメインの複雑な機 能の実装とかの重要なデータに関する部分の実装は 役に立つはず いきなり、ESのライブラリーを使うと何を実装して いるのかがわからないまま実装をしてしまう 最初は、簡単な同期的更新をするスクリプトを自分 で作成してどのように実装をするのかを理解する
Slide 26
Slide 26 text
ご清聴ありがとう ございました