Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

イベントソーシング・CQRSで、ドメイン駆動設計をシンプルかつ柔軟に実践する

Tomohisa Takaoka
November 25, 2024
5.9k

 イベントソーシング・CQRSで、ドメイン駆動設計をシンプルかつ柔軟に実践する

イベントソーシングは複雑で、導入障壁が高いと思っていませんか?しかし、ドメイン駆動設計(DDD)と組み合わせることで、システムの複雑さを扱いやすくし、柔軟な開発を実現できます。本セッションでは、イベントソーシング・CQRSとDDDの共通点と、それがもたらすメリットをわかりやすく解説します。具体的には、関心の分離や変更への対応力の向上など、開発現場でどのように役立つのかを、実際の事例を交えて紹介します。イベントソーシングをこれから始めたい方や、DDDをより深く理解したい方におすすめです。

https://architecture-con.findy-tools.io/2024/sessions?m=2024/mdl/special/dyVLGIAH

Tomohisa Takaoka

November 25, 2024
Tweet

More Decks by Tomohisa Takaoka

Transcript

  1. ネッ トシェア 可 ⾃⼰紹介 X: @tomohisa Github: @tomohisa Works at

    : 株式会社ジェイテックジャパン, J-Tech Creations, Inc. JTS Group - 株式会社ジャパンテクニカルソフトウェア 品川 CTO: 中⼩企業向けの受託開発を、モダンな開発スタイルで。 Microsoft MVP for Developer Technologies (Web Development, .NET) new from November 2024 - OSS: Sekiban - Event Sourcing and CQRS Framework ResultBoxes - Railway Oriented Programing Library. ⾼丘 知央 - Tomohisa Takaoka 2 / 43
  2. ネッ トシェア 可 イベントソーシング‧CQRSで、ドメイン駆動設計をシンプルかつ柔軟に実践する セッション概要 • 1. イベントソーシング、CQRSとは • 2.

    イベントソーシング‧CQRSをお勧めする理由 ◦ イベントソーシングの採⽤により、DDDの実践となる ◦ 良いアーキテクチャ構築の助けとなる ◦ 現場の評価 • 3. イベントソーシング‧CQRSのデメリットとは? ◦ デメリットと思われているが、取り組み⽅によってはデメリットではなくなっている点 ◦ 実際にトレードオフとして考えるべきこと • 4. イベントソーシング導⼊ガイド ◦ ⾃前でフレームワークを実装する場合 ◦ フレームワークを採⽤する場合 ◦ イベントソーシング‧CQRSフレームワーク、Sekibanのご紹介 • 5. まとめ 3 / 43
  3. ネッ トシェア 可 1. イベントソーシング‧CQRSとは? 5 / 43 イベントソーシング認識調査 知っている⽅?

    いつか使ってみたい? すでに使ったことある? 調べてみたけど難しい? 今の環境で使えないから関⼼ない? ちょっとわかんない技術?
  4. ネッ トシェア 可 1. イベントソーシング‧CQRSとは? 2008年6⽉に Eric Evans が、イベントソーシン グの概念を広く普及させた

    Greg Young をインタ ビューしている。 Greg Young は、⼤規模なトランザクションシス テムでのドメイン駆動設計 (DDD) 活⽤について 述べる中で、効率的なデータ管理を実現するリ ポジトリパターンを導⼊し、毎秒数万のメッ セージを処理する仕組みを解説している。イベ ントソーシングという⾔葉は使っていないもの の、実質的にはそれに関する説明。 Eric Evans は、DDD を⽤いたアプリケーション で⾼いスループットが達成できることに驚い た。 6 / 43
  5. ネッ トシェア 可 1. イベントソーシング‧CQRSとは? Eric Evansの⾔葉 “イベントソーシングは、基本的に異なるモデリングパラダイムです。 2003年 当時の技術(例:ORMや単⼀のリレーショナルデータベース)はイベントソー

    シングの採⽤を困難にしました。” 2016 - Eric Evans Domain-Driven Design Europe “「異なるパラダイム」と識者が述べた場合、それは従来の考え⽅や⽅法論とは根本的に異なる枠組みや視 点を指しています。つまり、物事の捉え⽅や解釈が全く異なり、新たな基準やルールのもとで物事を再構築 する必要がある状態です。” - 2024 ChatGPT 4o 「異なるパラダイム」なので、わからなくて当然。僕も『良さそう』から『わかってき た』まで1年くらいかかった 7 / 43
  6. ネッ トシェア 可 1. イベントソーシング‧CQRSとは? 8 / 43 ①ショッピングカートを”Tomo”さんが開始した ②コーヒーを⼀つ⼊れた

    ③オレンジジュースを3つ⼊れた ④チョコレートを2つ⼊れた ⑤オレンジジュースを2つ削除した “ChatGPT 現在のカートの内容を教えて” 現在のカートの中身を整理すると、以下の通りです: 1. コーヒー: 1個 2. オレンジジュース : 3個追加 → 2個削除 = 1個 3. チョコレート : 2個 イベントソーシングはアーキテクチャではなく、データ保存の⼿法。 データベースに現在のカートの状態ではなく、①- ⑤ のイベントをデータとして保存する⼿法のこと をイベントソーシングという。 ⼈間や⽣成AIはイベントのリストを⾒れば、現在の カートの中⾝を計算できるが、コンピュータは簡単 にできないので、計算するときに、現在の状態(ス テート)を計算する機能のことをプロジェクション という。 データのグループ(この場合カート)は集約 バックエンドで動くフレームワークでは、集約を指 定すると、計算された状態が簡単に取得可能
  7. ネッ トシェア 可 1. イベントソーシング‧CQRSとは? 9 / 43 イベントソーシングの仕組み -

    基本ルール • 集約単位でデータはパーティション管理をされていて、 そのパーティションにデータを⼊れる • (ドメイン)コマンドは、1つの集約に対して発⾏する • コマンドを受け取るコマンドハンドラは、現在の集約の データとコマンドの内容をもとに、イベントを⽣成す る。コマンドは常に命令形 CreateCart, AddItemToCart • コマンドハンドラはバリデーションを⾏ったりコマンド が失敗したエラーを返すことも可能 • イベントは確定した情報を表す。常に過去分詞形にす る。 CartCreated, ItemAddedToCart, CartShipped... • プロジェクションの時はバリデーションエラーや例外が 発⽣してはいけない。イベントを無視することは可能 コマンドハンドラー 関数 プロジェクション 関数 イベント イベント イベント データ コマンド データ 集約 データ イベントデータベース データ(JSON)
  8. ネッ トシェア 可 1. イベントソーシング‧CQRSとは? 10 / 43 CQRS -

    コマンドクエリー責務分離 はアーキテクチャの⼀部 CQRSは、Command Query Responsibility Segregation(コマンド‧クエリ責務分離)の略です。 これは、Greg Young⽒によって提案され、2010年頃に 「CQRS Documents」として発表した。 ポイントは、データを保存する際にはコマンドを使 い、書き込みモデル(Write Model)を使⽤すること。 ⼀⽅、データを読み取る際にはクエリを使い、読み取 りモデル(Read Model)を使⽤する。この読み取りモ デルは、マテリアライズドビューやライブプロジェク ションである場合がある。 CQRSは、イベントソーシング(Event Sourcing)と併 ⽤されることが多いが、CQRSはイベントソーシングを 使⽤しないプロジェクトでも多く使⽤されている。 クライアント コマンド コマンド ハンドラー イベント データベース プロジェクション クエリ イベント ワークフロー CQRS イベント ソーシング 集約
  9. ネッ トシェア 可 1. イベントソーシング‧CQRSとは? 11 / 43 イベントソーシング‧CQRSについてのよくある質問① Q.

    イベントソーシング‧CQRSはシステム全体に導⼊する必要がありますか? A. いいえ、1つのマイクロサービスから作ることも可能ですし、1つの集約だ けで導⼊することも可能です。 例) 弊社で最初に導⼊したプロジェクトでは、DDDとRDBで作成されたプロジェクトの1つの機能が、同時 書き込みによって起きるトランザクションエラーが多かったため、イベントソーシングで1つの作業開始、 終了を管理する機能のみを実装し、約2年間運⽤しています。
  10. ネッ トシェア 可 1. イベントソーシング‧CQRSとは? 12 / 43 イベントソーシング‧CQRSについてのよくある質問② Q.

    イベントソーシング‧CQRSが⼤規模なシステムだけでなく、スタートアッ プや中⼩企業向けのシステムにもマッチしますか? A. はい、マッチします。 イベントソーシング‧CQRSは、⼤規模システムでKafkaなどのストリーミングデータベースやイベント駆 動アーキテクチャと併⽤されることが多いのは確かです。しかし、⼩規模なアプリケーションで良く⽤いら れるモノリス‧モジュラーモノリスといったアーキテクチャでも、イベントソーシングによる履歴のアクセ スのしやすさや読み込み側と書き込み側の関⼼の分離などの利点を活⽤できます。 弊社はこれまで社内外のシステムにイベントソーシング‧CQRSを導⼊して稼働しており、開発に携わった メンバーは次のプロジェクトでもイベントソーシング‧CQRSを導⼊することに積極的です。
  11. ネッ トシェア 可 2. イベントソーシング‧CQRSをお勧めする理由 14 / 43 • ❶ドメイン駆動設計加速する

    ◦ ①制約に従うことによって、複雑な開発を可能になる ◦ ②イベントとコマンドにフォーカスすることにより、真のドメイン知識が明らかになる ◦ ③ドメインマスターとのコミュニケーションを促進する ◦ ④”戦術的”なドメイン駆動設計を合理的⾏うことができる ◦ ⑤関⼼の分離が⾃然な形で実践できる • ❷アーキテクチャとして有⽤ ◦ ①複雑なドメインを表現する⽅法として認知されている ◦ ②分散環境における問題解決の有⼒な結論となっている • ❸現場の評価 ◦ ①吉祥寺.pmでのアンケート ◦ ②『ドメイン駆動設計を始めよう』Vlad Kononov⽒ ◦ ③Eric Evans⽒
  12. ネッ トシェア 可 2. イベントソーシング‧CQRSをお勧めする理由 15 / 43 ❶ドメイン駆動設計を加速する ①

    制約 集約、コマンド、クエリ、イベントという『制 約』が良い設計の助けとなる “アーキテクチャ決定は、システムの制約を形 作り、何が許されて何が許されないかに関する 開発チームの指針となる” - ソフトウェアアーキ テクチャの基礎 1-1 ガードレールという制約が安全な運転を促進す るように、イベントソーシングの制約もドメイ ン駆動設計を加速する
  13. ネッ トシェア 可 2. イベントソーシング‧CQRSをお勧めする理由 16 / 43 ❶ドメイン駆動設計を加速する ②

    イベントとコマンドにフォーカスすることにより、真のドメイン知識 が明らかになる “ 要件収集に関するDDDのアプローチでは、開発者とドメインエキスパートの間で共通の理解を築くことを 重視します。... データ構造ではなく、ビジネスイベントやワークフローに焦点を当て(ます)。... ビジネス は単にデータを持っているだけではなく、何らかの⽅法でデータを変換するからです。” Scott Wlaschin 「関 数型ドメインモデリング」- 1.2. ビジネスイベントによるドメインの理解 “特定のストレージの実装を考慮せずにモデル化するのがよいのです。...「データベース」という概念は、確 実にユビキタス⾔語には含まれていません。ユーザーは、データがどのように永続化されるかについては気 にしません。” - 「関数型ドメインモデリング」 2.2. データベース駆動設計をしたいという衝動との戦い “イベントモデリングのさらに重要な利点は、時間軸へのフォーカスです。...「時間の経過とともにどのよう に変化するか」「ある事象が別の事象の前に発⽣した場合の影響」といった視点が、真のドメインの問題を 明らかにする鍵となります。システムの内部的な時間軸を掘り下げることで、重要なドメイン知識が浮かび 上がってくるのです。” - Greg Young Domain-Driven Design Europe 2016
  14. ネッ トシェア 可 2. イベントソーシング‧CQRSをお勧めする理由 17 / 43 ❶ドメイン駆動設計を加速する ③ドメインマスターとのコミュニケーションをやりやすくする

    “イベントストーミングは、複雑なビジネス領域を共同で探索するための柔軟なワーク ショップ形式です。既存ビジネスの改善点発⾒や新規ビジネスモデルの検討、イベント駆 動型ソフトウェアの設計など、多様なシナリオで活⽤できます。その適応性により、異な るバックグラウンドを持つステークホルダー間で、分野の壁を越えた新しいコラボレー ションを可能にします。” - https://www.eventstorming.com/ Alberto Brandolini ⽒の Event Storming 本には、具体的にどのような⽅法でイベントス トーミングを⾏うかが書かれている。 • Big Picture Workshop : システムの全体の⽅向性や、境界付けられたコンテキストを 定義するワークショップ • Process Modeling : サブドメイン内の実際のイベント、コマンドを定義していくワーク ショップ イベントストーミングで定義したコマンド、イベントはイベントソーシングの場合はその ままプログラムに適⽤することができる。
  15. ネッ トシェア 可 2. イベントソーシング‧CQRSをお勧めする理由 18 / 43 ❶ドメイン駆動設計を加速する ④戦術的なドメイン駆動設計もES‧CQRSにより⾏いやすく

    なる データ型 : 集約(Aggregate), イベント, コマンド, ワークフロー⼊ ⼒, クエリーパラメータ 関数 : コマンドハンドラー ワークフロー プロジェクション  クエリハンドラー それぞれのデータ型に意味があり、似た内容の型になることは あっても、詰め替えではない。 イベントはJSONなどのドキュメント型で保存されるため、 ORMapper⽤のオブジェクトへの詰め替えは不要になり、イン ピーダンスミスマッチを減らすことができる。 値オブジェクトをコマンド、イベントともに活⽤して、値オブ ジェクトにドメイン知識を表すことができる。 コマンド 集約 イベント データベース イベント イベント イベント フロントエンド API コマンド ハンドラー プロジェクション クエリ
  16. ネッ トシェア 可 2. イベントソーシング‧CQRSをお勧めする理由 19 / 43 ❶ドメイン駆動設計を加速する ④戦術的なドメイン駆動設計もES‧CQRSにより⾏いやすく

    なる データ型 : 集約(Aggregate), イベント, コマンド, ワークフロー⼊ ⼒, クエリーパラメータ 関数 : コマンドハンドラー ワークフロー プロジェクション  クエリハンドラー それぞれのデータ型に意味があり、似た内容の型になることは あっても、詰め替えではない。 イベントはJSONなどのドキュメント型で保存されるため、 ORMapper⽤のオブジェクトへの詰め替えは不要になり、イン ピーダンスミスマッチを減らすことができる。 値オブジェクトをコマンド、イベントともに活⽤して、値オブ ジェクトにドメイン知識を表すことができる。 コマンド 集約 イベント データベース イベント イベント イベント フロントエンド API コマンド ハンドラー プロジェクション ワークフロー⼊⼒ ワークフロー クエリ
  17. ネッ トシェア 可 2. イベントソーシング‧CQRSをお勧めする理由 20 / 43 ❶ドメイン駆動設計を加速する ⑤関⼼の分離が⾃然な形で実践できる

    “操作は⼤きく2 つのカテゴリに分けられる。それが、コマンドとクエリだ。... プログラムロジックのう ち、できる限り多くの部分を関数に置くこと。... コマンドは厳密に分離して、ドメインについての情報を戻 さない、⾮常に単純な操作にすること。ある概念が、値オブジェクトの担う責務に合致する場合には、複雑 なロジックをその値オブジェクトに移すことによって、副作⽤をさらに制御すること。” - エリック‧エ ヴァンスのドメイン駆動設計 10章「しなやかな設計」 Eric Evans も当時存在したCQSの概念を引⽤し、コマンドとクエリに作業を分けることにより、関⼼の分離 を⾏うことを述べている。2003年時点で、CQRSは誕⽣してなかったが、Greg Young がイベントソーシン グとCQRSをDDDのメーリングリストで発表してから、コマンドとクエリの関⼼の分離はより重要視される ようになった。
  18. ネッ トシェア 可 2. イベントソーシング‧CQRSをお勧めする理由 ❷アーキテクチャとして有⽤ ①複雑なドメインを表現する⽅法として認知されている “ドメインモデルとその変種(イベント履歴式ドメインモデル)は、業務ルールが複雑な業務領域に適した 実装⽅法です。つまり中核の業務領域です。中核の業務領域で、お⾦に関する処理、監査記録が法律で義務 づけられている業務、あるいは、システムの利⽤状況を深く分析したい場合、イベント履歴式ドメインモデ

    ルが役に⽴ちます。” - ドメイン駆動設計をはじめよう ソフトウェアの実装と事業戦略を結びつける実践技法 Vlad Khononov 「ドメイン駆動設計を始めよう」の本では、いろいろなところでイベント履歴式ドメインモデリングについ て語られている。10章「設計の経験則」では上記のようにイベンソーシングの採⽤を進めている。 “特に深く考えずに、イベントソーシングをお⾦や監査に関わらない⼩規模なプロジェクトに使⽤した結 果、それが多くの状況にマッチすることに気がついた。” - Greg Young 2016 DDD Europe 最初は⾦融系などがマッチすると考えられていたが、イベントソーシングに慣れることにおいて、必ずしお ⾦や監査が関係ないものの、時系列が関係する多くのシステム形式に適⽤できるということがわかってきて いる。 21 / 43
  19. ネッ トシェア 可 2. イベントソーシング‧CQRSをお勧めする理由 ❷アーキテクチャとして有⽤ ②分散環境における問題解決の有⼒な結論となっている DDIA本のMartin Kleppmann⽒の結論 12.1.1.2

    “広くサポートされた優れた分散トランザクションプロトコルが存在しないことから、様々なデータシステ ムを結合する上で最も期待できるアプローチは、ログベースの導出データだと私は考えています。” “イベントログを基盤とするシステムが頑健なのは、⾮同期に動作するからこそです。システム中の⼀部で ⽣じた障害がその部分に閉じておけるのはこのおかげです。” データ指向アプリケーションデザイン Martin Kleppmann Klepmann ⽒はYoutubeでイベントソーシングをどのようにLinkedInのシステムに導⼊したかに関する登壇 も⾏なっている。 22 / 43
  20. ネッ トシェア 可 2. イベントソーシング‧CQRSをお勧めする理由 ❸現場の評価 ②「ドメイン駆動設計を始めよう」著者 Vlad Kononov⽒ “イベントソーシングは多くの利点があるにもかかわらず、たいていの⼈は極端すぎると感じる

    ようです。この本で⼀貫して検討してきたように、この解決⽅法についても、事業の観点で判断 してください。  業務エキスパートと会話をします。状態更新式とイベント履歴式の2種類のモデルがあること を伝えます。⼆つのやり⽅の違いと、イベントソーシングの利点を説明します。特に、時間軸に そったモデルの利点を説明します。たいていの場合、イベントソーシングから得られる洞察の深 さをとても気に⼊り、イベントソーシングを同僚に積極的に売り込んでくれるでしょう。” ドメイン駆動設計をはじめよう “13章 現実世界のドメイン駆動設計” 13.4.1 24 / 43 結果整合性 (Eventual Consistency) は、分 散システムやデータベースにおける一貫性モデ ルの一つであり、すべてのノード(データのコ ピー)が最終的には一致した状態になることを 保証するものです。ただし、その一致は即座に は起こらず、時間がかかる可能性があります。 このモデルは、高可用性やスケーラビリティを 重視したシステムでよく採用されます。
  21. ネッ トシェア 可 “イベントソーシングは、基本的に異なるモデリングパラダイムです。 2003年当時の技術(例:ORMや単 ⼀のリレーショナルデータベース)はイベントソーシングの採⽤を困難にしました。近年のNoSQLや分散 システムに対応したフレームワークの進化により、この課題は緩和されています。関数型プログラミングの 不変性や宣⾔的構造は、イベントソーシングと相性が良く、コードの明確性を⾼めます。” 2016 -

    Eric Evans Domain-Driven Design Europe “Evans⽒が確信するDDDが⾰新をもたらす例の1つは、イベントソーシングである。データ構造の変更か ら、何かが発⽣していることまで、思考に変化をもたらすドメインモデリングの今までにないスタイルであ る。特定のドメインにおいて、発⽣した事象に関する個々のイベントは重要である。” 2016 - Eric Evans DDD eXchange conference InfoQ によるまとめ記事 https://www.infoq.com/jp/news/2016/07/ddd-software-development/ 2. イベントソーシング‧CQRSをお勧めする理由 ❸現場の評価③Eric Evans - 2016年 25 / 43
  22. ネッ トシェア 可 3. イベントソーシング‧CQRSのデメリットとは? 27 / 43 • ❶デメリットと感じられている(が実際にはそうではない)こと

    ◦ ①イベントソーシングで作成したシステムはコストが⾼い? ◦ ②今使っている⾔語、データベースで使えない? ◦ ③データの修正が難しそう? ◦ ④リードとライトのモデルが別で⾯倒なんじゃない? • ❷実際のトレードオフとして考えるべき点 ◦ ①設計者、テックリードの学習コスト ◦ ②実装者、プロジェクト参加者の学習コスト
  23. ネッ トシェア 可 3. イベントソーシング‧CQRSのデメリットとは? ❶実際にはデメリットではないこと ①イベントソーシングで作成したシステムはコストが⾼い? ビジネスオーナーはどうやって保存するかは関⼼ないけど費⽤は気になる。イベントソーシングシステム は、データが多く保存され、データの削除を基本的には⾏わないため、費⽤が⾼くなると考えるかもしれま せん。

    実際には、集約情報のキャッシュ、スナップショット(ある時点の集約の状態を保存して、次に読むときは そのスナップショットの後に起きたイベントだけを処理する)などを使⽤することにより、データベースの アクセスを最⼩限にとどめることにより、費⽤の効率化が可能 ある、Azure Cosmos DBを⽤いたシステムをリリース後1年以上運⽤していますが、クラウドプロバイダー の技術営業の⽅が驚くほど、安価にシステムが運⽤できている。 28 / 43
  24. ネッ トシェア 可 3. イベントソーシング‧CQRSのデメリットとは? ❶実際にはデメリットではないこと ③データの削除が難しそう? “イベントストアは追記専⽤のデータベースですが、データの物理削除が必要になった場合、ど うすればよいでしょうか。たとえば、GDPR(EU⼀般データ保護規則)*4に適合するためで す。この問題は、イベントソーシングの設計パターンの⼀つである、「忘れられる内容」

    (forgettable payload)で解決します。まず、イベントに含まれる、慎重に扱うことが必要な すべての情報を暗号化します。この暗号化のキーはイベントストアとは別のKey-Valueストア保 存します。Keyは集約の識別番号です。Valueは暗号化のキーです。暗号化された情報を削除し たい場合、Key-Valueストアに保存した暗号化のキーを削除します。その結果、イベントに含ま れる保護すべき情報は復元できなくなります。” ドメイン駆動設計をはじめよう ソフトウェアの実装と事業戦略を結びつける実践技法 Vlad Khononov 少し複雑な機構を取り⼊れないといけないものの、データの削除に対応することは可能。 30 / 43
  25. ネッ トシェア 可 3. イベントソーシング‧CQRSのデメリットとは? ❶実際にはデメリットではないこと ④リードとライトのモデルをわざわざ分けるのは⾯倒なんじゃない? 書き込みしたデータにすでに含まれているが、簡単に取得できないデータを、プロジェクションとリードモ デルを複数定義することによって追加可能であることは、有利な点となることが多い。 書き込みと読み込みの関⼼が分離されているため、データの計算間違えなどは、多くの場合、クエリー、読

    み込み側だけのバグであることも多い。例えば細かな計算ロジックや、繰り上げ、繰り下げなどの計算⽅法 に伴う間違えは、リードモデルの修正で対応可能。 書き込みデータが間違えた場合でも、修正イベントを発⾏することにより、過去のデータが間違えたことを 明⽰することにより、誰がどのタイミングでデータを間違えたのかなどのを気にしなくて良くなるため、 データの迷宮⼊り(誰がいつデータを更新してこのデータのなったのかがわからなくなる)ことがない BIやデータレイク向けのコンバート⽤にもプロジェクションとリードモデルを柔軟に定義可能。 31 / 43
  26. ネッ トシェア 可 3. イベントソーシング‧CQRSのデメリットとは? ❷実際のトレードオフ ①設計者、テックリードの学習コスト Eric Evansがいうように、「イベントソーシングは、基本的に異なるモデリングパラダイム」であるため、 新しい概念を学び、チームの牽引をできる技術⼒の⾼い⼈が必要

    「ドメイン駆動設計を始めよう」「関数型ドメインモデリング」「データ指向アプリケーションデザイン」 など、新しい本にイベントソーシングを含めた概念の説明や、トラブルシューティングを含めた情報が増え ているため、キャッチアップは⾏いやすくなっている。 学習コストが上がっても、開発コストや、⾼品質のプログラムができることによる、費⽤対効果も考えると トレードオフを考慮して、⼩さいプロジェクトから採⽤できるかもしれません。 慣れてきたら、Greg Youngのように「よく考えずに採⽤」も可能になってくる。 ⽇本で初めて、イベントソーシングがメインテーマの、CQRS+ES カンファレンスが12⽉21⽇に開催されま すので、ぜひお越しください。 32 / 43
  27. ネッ トシェア 可 4. イベントソーシング導⼊ガイド 35 / 43 • ❶

    ⾃前でフレームワークを実装する • ❷ 有名フレームワーク紹介 • ❸ Sekibanのご紹介
  28. ネッ トシェア 可 4. イベントソーシング導⼊ガイド ❶⾃前でフレームワークを実装する 理論はシンプルなので、オープンソース実装などを参考に、⾃前でフレームワークを作っていく⽅法を、 Greg Young は推奨している。

    イベントデータベースは、パーティションごとにデータを分割でき、JSONでデータを保存できるドキュメ ントデータベース(Dynamo DB, Cosmos DB)がおすすめですが、最近のRDBは速度やJSON対応が充実して いるため、⼗分使⽤可能。 デメリットとしては、プロジェクト開始まで時間がかかる。時に問題解決が難しく感じることがある。綺麗 な書き⽅に帰るためのリアーキテクチャーが難しいなど。 メリットとしては、構造を深く理解するため、発⽣する問題に対処しやすいなど。ある程度チームを取り分 けて社内研究をできる環境がある場合はおすすめ。 36 / 43
  29. ネッ トシェア 可 4. イベントソーシング導⼊ガイド ❸ Sekibanのご紹介 • 2023年12⽉にオープンソースリリース, 中⼩規模システムに特

    化したフレームワーク ◦ 全ての機能をApache 2.0 で使⽤可能! • C# .NET 8 & .NET 9 に対応 ◦ C#また、F#で利⽤可能 • 対応データベース ◦ Azure Cosmos DB ◦ AWS Dynamo DB ◦ Postgres • 関数型インターフェース ◦ 鉄道指向プログラミング ResultBox対応 ◦ コマンド、イベント、集約をシンプルに表現 • Github スターしてくださった⽅にブースでステンレスサーモ タンブラープレゼント中 ブースへお越しください! 38 / 43
  30. ネッ トシェア 可 まとめ 41 / 43 • イベントソーシングの概念はシンプルだ が、『新しいパラダイム』なので、理解が

    求められる • Eric Evansが認めているように新しい視点 で「何が起きているか」に焦点を当てたも ので、特定のドメインに⾮常に有効です。 • 柔軟にリードモデルを複数個作成できると いう特性により、『関⼼の分離』が促進さ れ、柔軟にシステムを構築できます。 • 便利なツールの⼀つとして皆様のツール ボックスに⼊れてみてはいかがでしょう か? • Sekibanは中⼩規模のシステムにおいて簡 単かつ効率的にイベントソーシングを導⼊ するフレームワークです。ブースにお越し ください!
  31. ネッ トシェア 可 42 / 43 参考資料 書籍 ソフトウェアアーキテクチャの基礎 ―エンジニアリングに基づく体系的アプローチ

    https://www.amazon.co.jp/dp/4873119820 関数型ドメインモデリング ドメイン駆動設計とF#でソフトウェアの複雑さに⽴ち向かおう https://www.amazon.co.jp/dp/B0DDBPNBVJ Introducing Event Storming https://leanpub.com/introducing_eventstorming エリック‧エヴァンスのドメイン駆動設計 https://www.amazon.co.jp/dp/B00GRKD6XU ドメイン駆動設計をはじめよう ―ソフトウェアの実装と事業戦略を結びつける実践技法 https://www.amazon.co.jp/dp/481440073X データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の⾼い分散システム設計の原理 https://www.amazon.co.jp/dp/4873118700 記事, Youtube Eric Evans Interviews Greg Young on the Architecture of a Large Transaction System https://www.infoq.com/interviews/Architecture-Eric-Evans-Interviews-Greg-Young/ Eric Evans — Tackling Complexity in the Heart of Software DDDEU 2016 https://www.youtube.com/watch?v=dnUFEg68ESM Greg Young — A Decade of DDD, CQRS, Event Sourcing DDDEU 2016 https://www.youtube.com/watch?v=LDW0QWie21s Event Storming https://www.eventstorming.com/ 吉祥寺.pm36で登壇しました。[登壇レポート] https://zenn.dev/jtechjapan_pub/articles/d7cee3524da131 Eric Evans⽒: ドメイン駆動設計はソフトウェア開発に有益か? https://www.infoq.com/jp/news/2016/07/ddd-software-development/