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

そろそろイベントソーシング・CQRSを使ってみてもいい頃なんじゃない?

Tomohisa Takaoka
September 17, 2024
3.6k

 そろそろイベントソーシング・CQRSを使ってみてもいい頃なんじゃない?

そろそろイベントソーシング・CQRSを使ってみてもいい頃なんじゃない?
いろんな面で準備が整ってきています...

イベントソーシングの良さを伝えつつ、Xでイベントソーシングやドメイン駆動開発について話している方、また吉祥寺.pm36参加予定の方を対象にしたアンケート結果を発表します!

1. アンケートした理由
2. ES・CQRSの良い点、悪い点、課題
3. 使う状況が整ってきている
4. まとめ

についてお話しします!

Tomohisa Takaoka

September 17, 2024
Tweet

More Decks by Tomohisa Takaoka

Transcript

  1. ⾃⼰紹介 高丘 知央 ( Tomohisa Takaoka ) 株式会社ジェイテックジャパンCTO イベントソーシング・CQRSフレームワーク Sekiban

    メンテナ 鉄道指向プログラミングライブラリ ResultBox 開発 米国カリフォルニア州ロングビーチ在住(ロスの近く) • X : @tomohisa • Github : @tomohisa • Linkedin : tomohisatakaoka 自作キーボード、3Dプリント自作トラックボール製作 London Tech Talk ポッドキャストとブッククラブ出演 #kichijojipm 🆗
  2. 株式会社ジェイテックジャパンの紹介 • 創業50年を超えた総合IT企業、株式会社 ジャパンテクニカルソフトウェア (JTS) のグループ企業。 • New York 所在

    J-Tech Creations, Inc. と 協業 • B2C / B2B アプリケーションを 開発‧運⽤するソフトウェア開発企業。 • .NET‧Azure 等 Microsoft の 技術スタックを主に使⽤。 #kichijojipm 🆗
  3. #kichijojipm 🆗 個人的イベントソーシングの出会い: 受託開発のアーキテクチャを試行錯誤し、 MVC→DDD。 レイヤードアーキテクチャ+RDBのプロジェクトの振り返りで、シンプ ルかつ同時接続性の強いアーキテクチャにしたく、色々調べたらイベントソーシング ・CQRSを見つけ、社内ように開発した 現在:C#によるES/CQRSフレームワーク Sekibanを開発した。

    • 中小規模、受託開発でも既に社内で使用し、本番運用している • フレームワークにより、プロジェクト開始後すぐドメインに入れる • 関数型、鉄道指向プログラミング • Azure にもAWSにもデプロイできる • OSSで公開、現在の全機能が使用可能 • イベントソーシング・ CQRSがとても気に入っている! ...しかし 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 1.アンケートした理由
  4. #kichijojipm 🆗 アンケート: 『イベントソーシング・CQRSについてのアンケート』 対象:バックエンドエンジニア、イベントソーシング経験者使ったことある人とない人の 両方の意見を聞いてみたかった リーチ:Xでツイート+いつもES/CQRSの発信をしている方にメンション ... 8件くらい集まり、ES/CQRS経験率100% 😱

    フォロー&DM大作戦を決行 • Xでイベントソーシングについて呟いている人をフォロー&DMで依頼 • 『ES CQRS』『ドメイン駆動開発』+吉祥寺.pm36参加者をフォロー&DM • 合計約200名をフォロー、 DM可の方にDM 󰢙 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 1.アンケートした理由
  5. #kichijojipm 🆗 イベントソーシング 定義:イベントソーシングとは、システム内で起こる全てのイベント(出来事)を時系列で記録 し、そのイベントの履歴から現在の状態を再現する手法です。 利点:(アンケートのまとめ) • 全ての業務イベントをデータベースに集約: システム上の出来事が自然に記録される。 •

    データ操作の監査と将来的な活用が容易: 完全なログとして機能し、再現性を担保。 • イベントドリブンな連携がしやすい: システム間の結合が疎結合になり、スケーリングが容易。 • ドメイン駆動設計( DDD)との親和性: エンジニア以外にも理解しやすい語彙で設計可能。 • 設計がシンプルで複雑性が低減: システムが小さくなり、ビジネス価値と直結しやすい。 • リプレイ機能により再現性を担保: イベントの再生で状態を復元可能。 • データの可視性と活用: イベント確認でシステム全体の可視性を確保。 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 2.ES‧CQRSの良い点、悪い点、課題
  6. #kichijojipm 🆗 イベントソーシングの利点 一部引用 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 2.ES‧CQRSの良い点、悪い点、課題 “プログラミングをしながら決定の先送り が可能:コマンドの処理を作りながらクエ リのことは考えない システム拡張の余地ができる:ジャーナ

    ルのデータを利用した別システムの構築 等” - なるせ(nrslib) “一般に語られるメリットの他に、デメリッ トである ストレージ容量/結果整合性/実 装難易度・量 を乗り越えさえすれば、他 の難易度が高い問題をほとんど考えなく てよくなり、質とスピードにも貢献してい ると感じれることが好きです。” - かきあ げせいろ
  7. #kichijojipm 🆗 CQRS 定義:CQRS(Command Query Responsibility Segregation)とは、データの更新操作(コ マンド)と参照操作(クエリ)の責務を明確に分離し、それぞれ別々のモデルやシステムで扱 う設計アーキテクチャです。 利点:(アンケートのまとめ)

    • コマンドとクエリの明確な分離: それぞれに特化した設計と実装が可能。 • コマンド側でドメインモデルに忠実な実装: ビジネスロジックに集中できる。 • クエリ側で柔軟なリードモデル構築: サービス要件に合わせたスキーマ設計が可能。 • 決定の先送りが可能: コマンド処理を作成しながらクエリを後回しにできる。 • リードモデルのスキーマ変更が容易: イベントストアからのリプレイで対応可能。 • スループットの向上: コマンドとクエリが同期しないため性能が向上。 • 責務の境界が明確: 非同期処理が許容される場合、実装がすっきり。 • ドメインに忠実なコード記述: 質と開発スピードの向上に寄与。 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 2.ES‧CQRSの良い点、悪い点、課題
  8. #kichijojipm 🆗 CQRSの利点 一部引用 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 2.ES‧CQRSの良い点、悪い点、課題 “CQRSは永続化ストレージを分離しなく ても利用でき、導入コストは低く効果が高 いと考えています。 コマンドとクエリでは要件が異なり、クエ

    リは画面などのユースケースによってか なり複雑になったりするので、リポジトリ との相性が悪く、リポジトリとは別の位置 付けにした方がシンプルになると考えて います。 この辺りがシンプルになることが良い点 だと思っています。” - (匿名) “イベントソーシングはドメインの特性や 処理を表現しやすい点、CQRSはリード モデルを柔軟に構築できる点” - LDDD はいいぞ
  9. #kichijojipm 🆗 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 2.ES‧CQRSの良い点、悪い点、課題 3. オーバーエンジニアリングと過剰な設計 オーバーエンジニアリングに陥りやすい。 スタックやデータベースの過度な分離が生じる。 小規模プロジェクトではオーバースペックになる。 4.

    パフォーマンスと処理時間の問題 イベントのリプレイに時間がかかる。 など... 1. 学習コストと習得の難しさ 学習コストが高く、習得が難しい。 DDD(ドメイン駆動設計)との併用でさらに難易度が上が る。 2. 実装の複雑さと開発の困難 実装が複雑で、開発手数が増える。 サポートするフレームワークやライブラリが少ない。 トランザクション管理や非同期処理の理解・実装が難し い。 プロジェクションやリカバリが複雑。 非同期処理によりクライアント側が複雑化する。 ES/CQRSの悪い点、苦手な点 (アンケートまとめ)
  10. #kichijojipm 🆗 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 2.ES‧CQRSの良い点、悪い点、課題 3. パフォーマンス・スケーラビリティ: データ量の 増加やパフォーマンスに対する懸念、スケーラビリ ティの課題。 4.

    デザインパターンの疑問: DB設計、CとQの 連携、API設計、スナップショットの利用などの技術 的な設計方法。 5. 学習・普及の課題: 学習リソース、書籍、社内 やSIerでの普及戦略。 など... 1. 導入・設計の難易度: イベントストーミングやイベント ソーシング、CQRSの実装や設計が難しいと感じる点や、 スムーズに導入するためのステップ。 2. 適用範囲・メリット: どのようなシステムに適している か、小規模・組み込み系や非同期処理不要なシステムで も使えるか、具体的なメリットやユースケース。 ES/CQRSの疑問、わからない点ー使ったことない方から (アンケートまとめ) アンケートの質問はブログなどで答えていきたいと思います。
  11. #kichijojipm 🆗 3-1. 学習の難しさ、学習コストに関する問題が改善しつつある Xで『イベントソーシング』 という文字を月毎に手集計 しました Xの投稿がなだらかながら 増えている。 ぜひ『イベントソーシング』

    とつぶやいて、年間記録を 達成しましょう! 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 3.使う状況が整ってきている
  12. #kichijojipm 🆗 3-1. 学習の難しさ、学習コストに関する問題が改善しつつある Google トレンド Event Sourcing CQRS 継続的に増加

    「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 3.使う状況が整ってきている
  13. #kichijojipm 🆗 3-1. 学習の難しさ、学習コストに関する問題が 改善しつつある 国内外でのたくさんの登壇 Youtubeビデオも増 えている DDD EU2023 では、

    イベントソーシングオンリーの Event Sourcing Liveが開催された 一番おすすめは Greg Young - CQRS and Event Sourcing - Code on the Beach 2014 (10年前のYoutube) 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 3.使う状況が整ってきている
  14. 🆗 ⾔語とデータベースの組み合わせとプロジェクトの成功 #kichijojipm 🆗 所見:かなりのバラエティでES/CQRSは利用されている 5 - C# - Postgres,

    Dynamo DB, Cosmos DB - tomohisa 3 - Typescript - Dynamo DB - よだ 3 - Rust - Postgres, Event Store, Apache Cassandra, ScyllaDB - リ シェラ 4 - Typescript, Java, Golang, Rust, Scala - Dynamo DB - かとじゅん 4 - Golang - Firestore - 夕暮おこは 3 - Golang - Dynamo DB - (匿名) 4 - Golang, Scala - Postgres, Dynamo DB - 群馬の 民 4 - Ruby - Postgres - LDDDはいいぞ 1 - Typescript, Python, Golang - Dynamo DB - u-na-gi 5 - Java, PHP, Golang, Kotlin, Scala - MySQL, Postgres, Dynamo DB, Apache Cassandra, HDFS - ytake 5 - Typescript, Python, PHP, Golang - MySQL, Postgres - (匿名) 4 - Python, Java, 言語がどれ、というよりはクラウドのサービスの特性 を生かしてイベントソーシング的な構成にして使っている - Dynamo DB - (匿名) 5 - Python, Java, Kotlin, Scala - MySQL, Oracle, Dynamo DB, sqlite(検証用) - なるせ(nrslib) 4 - Typescript, Java - MySQL - (匿名) 4 - Scala - MySQL - (匿名) 4 - C# - Postgres, Cosmos DB - 社内のマネー ジャー 4 - Java - Postgres, Apache Cassandra - かきあげせい ろ 5 - Java - MySQL, MongoDB, Redis, Apache Kafka - たかさん 3 - Java - Dynamo DB - kazu_kichi_67 4 - Ruby - Amazon SQS - qsona (発音: kyu-sona) 3 - Java - Postgres - masuda220 4 - PHP - MySQL, Redis, Groonga - shimabox 3 - Golang, Ruby - MySQL, Dynamo DB - @memetics10 3 - C# - Cosmos DB - (匿名)
  15. 3-3. プログラムの複雑さの解決策が増えている 多くのフレームワーク が開発されている。フレームワーク使用で複雑性を簡単に実現できる 例) Axon (java) Akka(Scala/Java) Commanded(Elixir) Prooth(PHP),

    Wolvenkit(Node.js) etc. • フレームワークの流儀でコードを書くことにより、デザインパターンやアーキテクチャはある 程度決まってくる • (例)Sekibanは開発用インフラ、コードの設定を10分でくらい済ませて、ドメインを書き始め られる[宣伝] • 多くのフレームワークには分散処理をサポートする機能が用意されている #kichijojipm 🆗 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 3.使う状況が整ってきている
  16. フレームワークを使用しないべきという意見 完全なコントロール : 自分たちで全てを実装することで、 システムを細部までコントロールできる。 特定要件への適応 : 特有の要件やドメイン依存を避け るため、独自実装が適している場合がある。 コスト面の考慮

    : フレームワークが有償の場合、コスト 削減のために自作を選択することもある。 3-3. プログラムの複雑さの解決策が増えている アンケート :フレームワークの使用についてどのように考えますか? #kichijojipm 🆗 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 3.使う状況が整ってきている フレームワークを使用すべき という意見 認知負荷と開発コストの軽減 : フレームワーク やライブラリを使うことで、開発者の負担を減ら し、時間と労力を節約できる。 技術的課題の解決 : 分散システム特有の複雑 さや技術的な難易度を、既存のフレームワーク がサポートしてくれる。 既存資源の活用 : 使えるライブラリがある場合、 それを活用することで効率的に ES+CQRSを導 入できる。 “原則的に、認知負荷を下げるためにフレームワークやライブラリを使ったほうがよ いと思います。” - かとじゅん
  17. #kichijojipm 🆗 3-4. ES/CQRSの適用範囲が増えている 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 3.使う状況が整ってきている 質問:近い将来で新規のプロジェクトがあった場合イベントソーシングを使ってみたいと思 いますか? 選択肢 1.

    絶対使いたくない 2. 多分使わない 3. 検討はしてみたい 4. 積極的に使用を検討したい 5. ぜひ使いたい 質問の意図: ES/CQRSを使っていない人と使った人で意識が違うのか?使った人はもう 辞めたいと思っているのか?
  18. 既存システムの⼀部にESを導⼊ことについてどう思うか? #kichijojipm 🆗 質問:既存システムの一部にイベントソーシング・CQRSを導入することをどのように思わ れますか? 選択肢 1. 避けた方がいい 2. 分からない

    3. 検討することはできると思う 4. 問題ないと思う 5. 積極的に取り入れて良いと思う 質問の意図: システム全体を変更するのは大変で追加機能の一部にES/CQRSを取り入 れることにより問題が生じると感じているのか? 3-4. ES/CQRSの適用範囲が増えている
  19. #kichijojipm 🆗 ES/CQRSを導入するチームの成功の鍵はなんだと思いますか? アンケートのまとめ 3-4. ES/CQRSの適用範囲が増えている 4. 学習意欲と前向きな姿勢: 新しい技術を受け入れ、 挑戦し続けるマインドセットを持つ。

    5. ビジネス目的の明確化: 導入による事業価値や解決 すべき課題を理解し、それに沿った取り組みを行う。 1. 知識と理解の重要性: 基本概念を深く理解 し、チーム内で知識を共有することが不可欠。 2. チームの合意とコミュニケーション: 導入の 目的やメリットを明確にし、全員が納得している こと。 3. リーダーシップとサポート体制: 経験者や強 い意志を持つリーダーがチームを導くことが重 要。 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 3.使う状況が整ってきている
  20. #kichijojipm 🆗 ES/CQRSを導入するチームの成功の鍵はなんだと思いますか? アンケート引用 3-4. ES/CQRSの適用範囲が増えている “学習能力(新しく不確実なことに好奇心、探求 心、向上心を持って取り組む姿勢)” - masuda220

    "知識などももちろんありますが、まずはチャ レンジし続ける気合い(一歩踏み出して見る だけです)、ということにしておきますw 失敗を気にせずまずはやってみましょう! ネット上にいる人たちにいつでも疑問を投げ てみてください" - ytake 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 3.使う状況が整ってきている
  21. #kichijojipm 🆗 アンケート、ありがとございます! 記名の方(敬称略) かとじゅん 群馬の民 ytake なるせ(nrslib)社内のマネー ジャー kazu_kichi_67

    shimabox よだ @shotanue 夕暮お こは LDDDはいいぞ 非匿名希望 かきあげせいろ qsona (発音: kyu-sona) @memetics10 @piyorinpa Magnolia.K し があきとし リシェラ ひろた @ryuke u-na-gi しょーだい かろっく たかさん masuda220 その他、匿名の皆様 貴重なご意見、ありがとうございました! アンケートにより、使用している他の開発者 の満足度を知ることかできた。答えてくだ さった方、ありがとうございます! DM受け 取った方、お騒がせしました 使っているみなさんはとても便利と感じてい て、これからも使い道がたくさんあるというこ とが再確認できた 使っていないみなさんも結構関心があるこ ともわかった! 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 4. まとめ
  22. #kichijojipm 🆗 うれしいことがありました  🥹 アンケートの過程で私たちの開発している Sekibanを知っているとおっしゃってくださっ た方や、Sekibanのコードを参考にして、し かもSekibanの実装を非常に良いと言って くださったがおられた。 また『良い取り組みですね』とおっしゃってく

    ださったり、忙しくて回答できないとわざわざ 言ってくださった方も嬉しかった。 「そろそろイベントソーシング‧CQRSを使ってみてもいい頃なんじゃない?」 4. まとめ フレームワークを開発していることも良い取り組みだ と褒めてくださった方もおられ、嬉しかった。 OSSの開発は、皆に気づかれないものでなかなか スターも増えていかないものですが、この登壇を機 会に、イベントソーシングや技術に関して励みを得 ることができました。 https://sekiban.dev からGithubに飛べます。 https://github.com/J-Tech-Japan/Sekiban スターしてくれるととてもうれしいです!!!
  23. まとめ • イベントソーシング‧CQRSはいろんな⾔語、い ろんなデータベース、⾊々な規模のシステムで採 ⽤され始めている • イベントソーシング‧CQRSは、Sekibanなどのフ レームワークを使うと、複雑性をフレームワーク に委ねることができ、今では多くの参考情報があ る。

    • イベントソーシング‧CQRSを⼀度使うところま で学習した⼈の多くは、継続して使いたいと考え ている • ツールの1つとしてサンプルからでも試してみる のをおすすめ! #kichijojipm 🆗