CQRS/Event Sourcingを学ぶための教材(2020年版)
この記事の更新版です。
僕がCQRSに入門したの2016年でした。すでに海外のDDDコミュニティではCQRS/Event Sourcing(以下, ES)に関する議論は盛んにされていました。
2020年になってようやく日本でも話題になることが多くなった印象なので、教材となりそうな書籍などの情報を簡単に紹介します。
前提となる教材
前提としてはEvans本を読んでいるということにさせてください。
さらにDDD本には ES の基礎となる ドメインイベント の解説が含まれていません。そのドメインイベントの概要を掴みたければ、実践ドメイン駆動設計に記載があります。
基礎教材
考案者であるGregさんのドキュメントです。
CQRS Documents by Greg Young
和訳版はこちら。CQRS Documents by Greg Young 和訳版
概念を把握するならこれが以外にないです。
もともとは2009年11月に公開された「CQRS à la Greg Young」というブログ記事が起源だそうです。日本では10年遅れですね。
2010年2月に投稿された記事もあります。
CQRS, Task Based UIs, Event Sourcing agh!Posted by gregyoung on February 16, 2010
関連教材
書籍
最近の書籍でよいなと思ったのは以下です。どう実装するかという観点で読むにはよい本です。
- データ指向アプリケーションデザイン 「11.2 データベースとストリーム」にEvent Sourcingについて解説があります。
- .NETのエンタープライズアプリケーションアーキテクチャ第2版 .NETを例にしたアプリケーション設計原則 第10〜13章がCQRS/Event Sourcingです。
僭越ですが、僕のこれまでの活動履歴のような、スライドとブログ記事は以下です。★がお勧めです。
スライド
- ★CQRSはEvent Sourcingなしで実現できるのか?
- ★CQRS+ES(再)入門
- Introduction to the practice Reactive-DDD
- ★ChatWorkの新メッセージングシステムを支える技術
- DDD実践(ベスト)プラクティス ~ドメインイベントとマイクロサービスと組織の関係~
- 最新DDDアーキテクチャとAkkaでの実装ヒントについて
ブログ記事
- ★CQRSはなぜEvent Sourcingになってしまうのか
- ★CQRSはモデルだけでなくモジュールも分割する
- ★具体的な実装コードからEvent Sourcingを理解する
- CQRS/ESによって集約の境界定義を見直す
Event Storming
CQRS/ESとしての設計技法は時間を掛けて学べば身につくと思いますが、イベントを基軸に対象ドメインをどう分析するかのスキルも養わなければなりません。Event Stormingを学ぶとよいです。以下は考案者執筆中の書籍です。
その他関連スライドや記事は以下。
- EventStormingをやってみた話
- EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
- 明日からはじめられるEventStorming(イベントストーミング) / Let's try EventStorming
実践教材
プロダクションでスケールするCQRS/ESは、今のところAkka以外ではほぼ選択肢がないです。Event Storeを使う方法もありますが、そもそもストレージが限定される制約が許容できない場合は使えません(Akkaではストレージのプラグインが対応していれば制限はありません)。Golangではproto.actorは有望ですが、先駆者であるAkkaの後追いの開発になっているようです。
というわけで、実践するための教材は、Akkaがお勧めです。教材というかツールキットなのですが、チュートリアルやサンプルを通して、理解を深められるはずです。
プログラミング言語はScalaになりますが、Java/Kotlinでも利用できます。あと.NET版もあります。とはいえ、関連書籍やドキュメントにはScalaで書かれているものが多いので、Scala以外の言語でやるとしてもScalaコードが読めたほうがよいという話になります。
お勧めの書籍は、僕も翻訳レビューに参加させてもらった、Akka実践バイブル アクターモデルによる並行・分散システムの実現です。この本にはAkkaでESを行うための解説があります。公式ドキュメントと併せて読むと良いです。
この書籍に一つ難点があるとしたら、最近AkkaのAPIが刷新されて、書籍に記載されているコードが古くなったということです(Akkaで実装できるアクターにはメッセージを送受信する機能があり、受信できるメッセージの型を指定できるようになりました。つまりメッセージ送受信がタイプセーフになりました)。この本は一つ前のメジャーバージョン(2.5)で書かれています。最新バージョン(2.6)でも古い形式のAPIはサポートされています。CQRS/ESの概念理解にバージョンは関係ありません。古いバージョンでも問題はありません。Akkaに慣れたら新APIで書き直せばよいです。
実装コードは以下を参考にしてください。
Akka2.5でのサンプル
Akka2.6でのサンプル
- https://github.com/akka/akka-samples/tree/2.6/akka-sample-cqrs-scala
- https://github.com/j5ik2o/motherbase
2.6のサンプル二個目は僕が開発中のものです。
自分が運営している、私塾 匠真堂(しょうまどう)のDiscordでCQRS/ESはフォローしているので、興味があれば参加して質問していただければよいと思います。
最後に手前味噌ですが、ZennでBookを発売中です。まだ執筆中ですがよかったらどうぞ。
Discussion