タイトルの通り、昨日CQRS+ESカンファレンスに参加してきました。
アーカイブ無しの現地視聴のみということで、記憶が鮮明なうちにレポートに残そうと思います。
- タイトルの通り、昨日CQRS+ESカンファレンスに参加してきました。
- はじめに
- イベント爆誕
- オープニング
- ドメインイベントで描く未来: CQRS/ESが変えるシステムとDXの可能性
- 2年間の実運用を経て振り返るイベントソーシングの実際
- いろんな機能をCQRS+ESで作ってみたので皆で所感を見てみよう
- ステップバイステップではじめるES、CQRS
- アクターシステムに頼らずEvent Sourcingする方法について
- パネルディスカッション
- LT
- 懇親会
- おまけ
- 終わりに
はじめに
そもそもCQRS+ESってなんぞや?ってところを触れておこうと思います。
後段で触れますが、イベントのテーマがCQRS+ESにフォーカスした1歩先の議論となっていて、CQRSやESの基本的な説明は最小限となっています。
もし興味があってこれから始めようと思っている方が読むと、高確率で脱落する気がするのでここであえて補足させていただきます。
知ってるぞーって方は読み飛ばしてください🙏
# 筆者の主観を多いに含んでいるので、なんとなく雰囲気を掴む程度にご利用ください
# 引用部分はChatGPTからの回答を持ってきています
CQRS(Command and Query Responsibility Segregation)とは、ソフトウェア設計パターンの一つで、「コマンド」と「クエリ」の責務を分離することを目的としています。この設計により、システムの可読性、性能、スケーラビリティが向上することが期待されます。
DDD(ドメイン駆動設計)のアーキテクチャパターンの1つ。
「コマンド」と「クエリ」、言い換えると「システムにおける状態変化」と「システムにおける状態参照」を分離して考えます。
一般的にビジネスロジックは「コマンド」側に集約されるため、そちらをドメインモデルで表現し、「クエリ」側は参照モデルとして表示要件に合わせて表現します。
それによって、参照要件に引きずられてなんだか似たようなドメインモデルが量産されることを防いだり、ドメインモデルのみだとどうしても一覧画面のような集約を跨る参照がある場面で、N+1問題を引き起こすような状況を回避することが出来ます。
また、「コマンド」と「クエリ」を分けることで、それぞれ適切なインフラが選択可能になります。例えば「コマンド」側を書き込みが高速なNoSQL、「クエリ」側を表現豊かなRDBを用いる構成を取ることが可能になります。最近だとNewSQLを使って両方まかなうパターンも増えてきている印象です。
イベントソーシング(Event Sourcing)とは、ソフトウェアシステムのデータ管理手法の一つで、システムの状態を直接保存するのではなく、状態変化を表すイベントを順次記録するという考え方に基づいた設計パターンです。
上記の説明の通りで、一般的なDDDでは集約単位のドメインモデルの状態をそのまま保存するのに対して、イベントソーシングはシステムのイベントに着目して、状態変化を蓄積する形で保存するのが大きな違いになります。
状態変化の蓄積の射影として、最新状態のスナップショットが作られ、それが「クエリ」として参照されることになるため、必然的にCQRSとはセットで用いられることが多くなります。
モデリング手法の1つであるイベントストーミングでは、ビックピクチャーとしてイベントの洗い出しから始まりますので、それをそのままコードに落とし込んだ結果イベントソーシングになることも多いと思われます。
手前味噌ですが、8月に社内勉強会がありまして、そこでトレンドアーキテクチャとして「CQRS + ES」について紹介したスライドがありますので、併せてご覧いただけると嬉しいです🙏
https://kazu-kichi-67.github.io/slidev-history-of-architecture/22
イベント爆誕
これは裏取りしてないので私の妄想として見てほしいのですが、
今回のイベント発端として吉祥寺.pm36があったと認識しています。
テーマは「プログラミング!」だったんですが、メインセッション4つのうち2つがCQRS + ESに関連するセッションということで、観測範囲でにわかに盛り上がりの兆しがあったと記憶しています。
特に高丘さんが行ったフォロー&DM大作戦によって、関心の高さが明らかになった一方で、改善しつつあるとはいえ、学習コストの高さも相まって、興味あるけど踏み出せていない層が一定いることもわかったように思います。
気になるアンケート結果はこちらの記事でまとめて頂いております!
そこから1ヶ月経たずして、本カンファレンスの発起人であるytakeさんから以下のアナウンスがありました。行動力!!
CQRS ESカンファレンス爆誕しましたのでよろしくおねがいしますー
— yuuki takezawa@ytake (@ex_takezawa) 2024年10月11日
CQRS/ESに関する質問や疑問も直接聞くことができたり、
ドメインイベント活用などについても知ることができます!
当日スタッフも募集しておりますー!
https://t.co/6SKgAKssLm #cqrs_es_con
昨今のカンファレンスといえば、企業スポンサーを募って開催されることが多いですが、今回のCQRS + ESカンファレンスは今どき珍しいスポンサーの無いカンファレンス。ホスピタリティは期待しないでとの前振りでしたが、全くそんなこと感じさせない完成度でした!
登壇者兼カメラマンである成瀬さんお手製のネームカード。
完璧すぎるネームカード作ったわ#cqrs_es_con pic.twitter.com/ahVDgY9KY9
— nrs (@nrslib) 2024年12月20日
GMOさん、会場提供ありがとうございましたーm
めちゃめちゃ綺麗なオフィスでした!羨ましい!
なんとか準備できた
— nrs (@nrslib) 2024年12月21日
バタバタやった#cqrs_es_con pic.twitter.com/nzt5rVvobU
オープニング
お待たせしました、ようやく実際のイベントの中身に入っていきます!
発起人であるytakeさんから、日本のテクノロジーの未来について熱いお話しを拝聴しました。
海外では、古典的なDDDの戦術パターンから抜け出して、一歩先の議論に進んでいる。
日本も負けたくないから今回のカンファレンスを立ち上げたと。
ライバルイベントたち。
それぞれYouTubeにアーカイブが残ってそうなので、要チェックですね!!
ドメインイベントで描く未来: CQRS/ESが変えるシステムとDXの可能性
オープニングの流れでヌルッとytakeさんのセッションに移ります。
日本の開発文化や、システム開発における課題を明らかにしつつ、データではなくイベントを中心にシステム構築することで解決する方向性を示します。
一方で、イベントソーシングは既存のシステムイメージとは全く異なる新しい考え方になるため、最初は取っ付きにくく学習難易度は高い。
そのスタートとなるような、イベントの見分け方や適用パターンを具体例を交えて説明されてました。
最後は実装パターンの1つとして、アクターモデルの紹介をされていました。
スライドは見つけ次第追記させていただきます!
2年間の実運用を経て振り返るイベントソーシングの実際
#cqrs_es_con の1:50からの資料を公開します!字が小さいところもありますので、よろしかったらご覧ください。スクショ投稿などご自由にされてください。https://t.co/0NeGlfgw8J
— Tomohisa Takaoka | Microsoft MVP (@tomohisa) 2024年12月21日
高丘さんからは、自社で作っているSekibanというCQRS+ESを実現するOSSに関する説明や利用・運用実績に関する報告がありました。
現時点で中小規模のシステム事例のみではあるものの、想像よりも運用コストが安かったのが印象的でした。
また中盤のよく聞かれる疑問と、現在の答えに関する部分では、データの一貫性や非同期前提による結果整合性に関するお話がありました。
ビジネス上のアーキテクチャ特性として、設計要件に含める必要があり、
既存システムのリプレイスやリアーキテクトでイベントソーシングに載せ替える際に1つの障壁になり得ると感じました。
そこの部分をどうユーザコミュニケーションするのかは予め詰めておかないと後でシンドイことになりそうなので注意が必要かもしれません。
それにしても、自前のOSSを使って受託開発に臨む姿勢は、同じ受託開発を経験していた身からすると背筋が伸びる思いでした。
いろんな機能をCQRS+ESで作ってみたので皆で所感を見てみよう
本日の資料ですhttps://t.co/Png5LYwi70
— nrs (@nrslib) 2024年12月21日
対戦よろしくお願いします#cqrs_es_con
成瀬さんからは、実際にJava+Axon Frameworkを使ったシステムを動かしながら、コードの解説をしていただきました!
おそらくJava界隈の方は多くなかった印象ですが、私にとっては実家のような安心感があって最高でした。
成瀬さん「Javaならみんな読めますよね??」
イベントの順序性に関して気になってポストしたところ、セッション後に回答いただきました!Axon便利!
集約ごとでイベントの順序は保存されます!
— nrs (@nrslib) 2024年12月21日
具体的には AggregateIdentifier という ID でシャーディングしてます
イベントの削除はしないで、個人情報の削除っぽいことを実現する方法も、なるほど〜って感じで聞いてました。勉強になる📝
これは入力値を暗号化するキーを例えばユーザーごとに作っておいて、ユーザーが退会をしたときに対応するキーを物理削除すればイベントは残るけど内容は復号できない、という状態が作れます #cqrs_es_con https://t.co/47sJt0Mpy7
— yasaichi (@_yasaichi) 2024年12月21日
イベントが大量にあると削除コストがバカにならないので、鍵ペアを作って事前に暗号化しておき、復号するための秘密鍵を破棄することで削除したものと同義とすることがありますね。これはGDPRで使われるテクニックでもあります。 #cqrs_es_con
— 加藤潤一(かとじゅん) (@j5ik2o) 2024年12月21日
個人情報等の削除周りのお話、Cryptographic Erase って名前が付いてるらしい。https://t.co/fsK1LH8oAS#cqrs_es_con
— こたつ&&みかん (@kota2and3kan) 2024年12月21日
Axonのカンファレンスがあるの知らなかった・・
余談ですが、この秘密兵器セッション中もずっと付けてて、序盤slidoの質問が大喜利大会みたいになってたのが面白かったですw
今回からカンファレンスに投入した秘密兵器です#cqrs_es_con pic.twitter.com/DIe5QBHrSK
— nrs (@nrslib) 2024年12月21日
ステップバイステップではじめるES、CQRS
鈴木さんの発表は、実際に数年CQRS+ESのソフトウェアを開発運用した経験に基づく知見や勘所の紹介がありました。
直前に方針変更をされたとのことで、セッションタイトルは変わっていました。
ECサイトを例にしたモデリングの紹介や、実際の設計紹介が同じコンテキストを扱う身としてはとても参考になりました!
きのこ→たけのこ 面白かったので、スライド公開を楽しみにしておりますw
こちらも見つけ次第追記させていただきます!
アクターシステムに頼らずEvent Sourcingする方法について
今回の発表の資料です。 #cqrs_es_conhttps://t.co/6fEtntlRy7
— 加藤潤一(かとじゅん) (@j5ik2o) 2024年12月21日
メインセッション最後はかとじゅんさんから、アクターシステムを使わず自前でイベントソーシングを実装する手法の紹介がありました。
最初は全体のシステム構成図を見ながら必要な機能を丁寧に解説していただき、その後アクターモデルを使わない、AWS方式とKJ方式の紹介がありました。
AWS方式
KJ方式
KJ方式については、コマンド側を中心に実際のコード例を見ながらかなり詳しく説明されてました。
次回、コマンドとクエリの連携編が待ち切れないです。
パネルディスカッション
事前に質問を募って、それに回答する形で進みました。
Ask the Speakerもそうだが、こんな豪華なメンバーに無料で相談やアドバイス貰えるって冷静に考えると贅沢過ぎる時間ですよね・・w
次のパネルディスカッションでこういう疑問があるので答えてほしい!というものがありましたらこちらの返信どうぞ!(いくつかピックアップします #cqrs_es_con
— yuuki takezawa@ytake (@ex_takezawa) 2024年12月21日
イベントソーシングしてて、外部IFをRESTにするとリソースの概念とコンフリクトしがちってのは確かに・・ってなった。。
なんとなくしっくりこなくてカスタムメソッドを検討したことがあったな〜
LT
LTはそれぞれ実際のサービスでCQRS+ESを実践している内容中心で、もうこんなに活用事例があるんだと驚きました・・!
ドラの音が思いのほか優しかったのが印象的でした。
そしてお話した資料です
— Shiro Seike / せいけしろー (@seike460) 2024年12月21日
CQRS+ES の力を使って効果を感じる#cqrs_es_conhttps://t.co/EJZl1QIHTD
昨日の LT 資料ですhttps://t.co/PO2mrzWAsL#cqrs_es_con
— Kosuke Abe (@memetics10) 2024年12月22日
昨日はありがとうございました!
— JGEEM (@EM4326168385309) 2024年12月22日
LT資料共有です
懇親会では色々な方のお話を聴くことができて最&高でした
企画・運営いただいたみなさまに感謝です
来年開催に向けてお手伝いできることあればぜひ#cqrs_es_con
使いたいから使うんじゃなく「必然」として使うCQRS+ES https://t.co/ND3RtFcCXC
本日のLTで使用した資料です!🙌https://t.co/Zbw5hPXTdE#cqrs_es_con
— ほりしょー (@H0R15H0) 2024年12月21日
本日のイベントの登壇内容、過去登壇したものでQiitaにもまとめているので共有しておきます、
— 春田 岬 (@harumisa31) 2024年12月21日
本日喉を痛めて声がかすれており聞き取りづらいかと思いますので、お手元で記事を開きながら見ていただけますと!https://t.co/fmD9YqkPqq#cqrs_es_con
懇親会
懇親会では、ビールとハイボール、ソフトドリンク、肉魚野菜スイーツがそれぞれ小皿になっているおしゃれなオードブルが振る舞われました。(写真撮り損ねました> <)
申し込みサイトが別れていたせいなのか、次の日PHPのイベントが控えていたせいなのか、想像していたよりも懇親会まで残った人は少なかった印象(1割くらい?)で、登壇者の方々や参加者の皆さんとゆっくり交流することが出来ました。
高丘さんとは吉祥寺.pmのアンケートでやり取りさせていただいてから念願の初対面を果たすことができ、また、かとじゅんさんとはお仕事で2年弱お世話になってましたが、こちらもリアルでお会いしたのは初めてだったので直接感謝を伝えられて感無量でした> <
CとQが分離したパーカー欲しかったけど、じゃんけん大会は敗北。。
次回は物販をお願いしますw
懇親会参加の方にいつものじゃんけん大会かなんかでプレゼントします!(4着あります)
— yuuki takezawa@ytake (@ex_takezawa) 2024年12月21日
#cqrs_es_con pic.twitter.com/BfD8uxeq6d
おまけ
会場付近は美味しそうなお店がたくさんありました。
早く着いたので渋谷ランチ。
— kazu_kichi_67 (@kazu_kichi_67) 2024年12月21日
フラッと入ったタレカツのお店、味も雰囲気も良かった!ビールは我慢しました pic.twitter.com/iQFukP5LuI
懇親会終わり、会場から徒歩1分のつけ麺屋へ。
半分食べたあたりで酢橘を絞ってさっぱりと頂けました😋
シメ。 pic.twitter.com/8Bid84azDk
— kazu_kichi_67 (@kazu_kichi_67) 2024年12月21日
終わりに
CQRS+ESカンファレンスを実現していただいた運営スタッフの皆さま、登壇者の皆さま、そして参加者の皆さま、楽しい時間を本当にありがとうございました!
そして、ワガママを言わせて頂くと第二回もぜひ開催お願いしますw🙏
僭越ながらブログを書くことで次回開催の一助となれば幸いです。