kazu_kichi_67の日記

とにかく明るいエンジニア

第一回CQRS+ESカンファレンスに参加しました

タイトルの通り、昨日CQRS+ESカンファレンスに参加してきました。

アーカイブ無しの現地視聴のみということで、記憶が鮮明なうちにレポートに残そうと思います。

 

cqrs-es-con.connpass.com

 

 

はじめに

そもそもCQRS+ESってなんぞや?ってところを触れておこうと思います。

後段で触れますが、イベントのテーマがCQRS+ESにフォーカスした1歩先の議論となっていて、CQRSやESの基本的な説明は最小限となっています。

もし興味があってこれから始めようと思っている方が読むと、高確率で脱落する気がするのでここであえて補足させていただきます。

知ってるぞーって方は読み飛ばしてください🙏

 

# 筆者の主観を多いに含んでいるので、なんとなく雰囲気を掴む程度にご利用ください

# 引用部分はChatGPTからの回答を持ってきています

 

CQRS(Command and Query Responsibility Segregation)とは、ソフトウェア設計パターンの一つで、「コマンド」と「クエリ」の責務を分離することを目的としています。この設計により、システムの可読性、性能、スケーラビリティが向上することが期待されます。

DDD(ドメイン駆動設計)のアーキテクチャパターンの1つ。

「コマンド」と「クエリ」、言い換えると「システムにおける状態変化」と「システムにおける状態参照」を分離して考えます。

一般的にビジネスロジックは「コマンド」側に集約されるため、そちらをドメインモデルで表現し、「クエリ」側は参照モデルとして表示要件に合わせて表現します。

それによって、参照要件に引きずられてなんだか似たようなドメインモデルが量産されることを防いだり、ドメインモデルのみだとどうしても一覧画面のような集約を跨る参照がある場面で、N+1問題を引き起こすような状況を回避することが出来ます。

また、「コマンド」と「クエリ」を分けることで、それぞれ適切なインフラが選択可能になります。例えば「コマンド」側を書き込みが高速なNoSQL、「クエリ」側を表現豊かなRDBを用いる構成を取ることが可能になります。最近だとNewSQLを使って両方まかなうパターンも増えてきている印象です。

docs.aws.amazon.com

learn.microsoft.com

 

イベントソーシング(Event Sourcing)とは、ソフトウェアシステムのデータ管理手法の一つで、システムの状態を直接保存するのではなく、状態変化を表すイベントを順次記録するという考え方に基づいた設計パターンです。

上記の説明の通りで、一般的なDDDでは集約単位のドメインモデルの状態をそのまま保存するのに対して、イベントソーシングはシステムのイベントに着目して、状態変化を蓄積する形で保存するのが大きな違いになります。

状態変化の蓄積の射影として、最新状態のスナップショットが作られ、それが「クエリ」として参照されることになるため、必然的にCQRSとはセットで用いられることが多くなります。

モデリング手法の1つであるイベントストーミングでは、ビックピクチャーとしてイベントの洗い出しから始まりますので、それをそのままコードに落とし込んだ結果イベントソーシングになることも多いと思われます。

docs.aws.amazon.com

learn.microsoft.com

 

手前味噌ですが、8月に社内勉強会がありまして、そこでトレンドアーキテクチャとして「CQRS + ES」について紹介したスライドがありますので、併せてご覧いただけると嬉しいです🙏

https://kazu-kichi-67.github.io/slidev-history-of-architecture/22

イベント爆誕

これは裏取りしてないので私の妄想として見てほしいのですが、

今回のイベント発端として吉祥寺.pm36があったと認識しています。

テーマは「プログラミング!」だったんですが、メインセッション4つのうち2つがCQRS + ESに関連するセッションということで、観測範囲でにわかに盛り上がりの兆しがあったと記憶しています。

kichijojipm.connpass.com

speakerdeck.com

speakerdeck.com

 

特に高丘さんが行ったフォロー&DM大作戦によって、関心の高さが明らかになった一方で、改善しつつあるとはいえ、学習コストの高さも相まって、興味あるけど踏み出せていない層が一定いることもわかったように思います。

気になるアンケート結果はこちらの記事でまとめて頂いております!

zenn.dev

 

そこから1ヶ月経たずして、本カンファレンスの発起人であるytakeさんから以下のアナウンスがありました。行動力!!

 

昨今のカンファレンスといえば、企業スポンサーを募って開催されることが多いですが、今回のCQRS + ESカンファレンスは今どき珍しいスポンサーの無いカンファレンス。ホスピタリティは期待しないでとの前振りでしたが、全くそんなこと感じさせない完成度でした!

 

登壇者兼カメラマンである成瀬さんお手製のネームカード。

 

GMOさん、会場提供ありがとうございましたーm

めちゃめちゃ綺麗なオフィスでした!羨ましい!

オープニング

お待たせしました、ようやく実際のイベントの中身に入っていきます!

 

発起人であるytakeさんから、日本のテクノロジーの未来について熱いお話しを拝聴しました。

 

海外では、古典的なDDDの戦術パターンから抜け出して、一歩先の議論に進んでいる。

日本も負けたくないから今回のカンファレンスを立ち上げたと。

 

ライバルイベントたち。

それぞれYouTubeアーカイブが残ってそうなので、要チェックですね!!

2022.eventsourcing.live

dddeurope.com

ドメインイベントで描く未来: CQRS/ESが変えるシステムとDXの可能性

オープニングの流れでヌルッとytakeさんのセッションに移ります。

 

日本の開発文化や、システム開発における課題を明らかにしつつ、データではなくイベントを中心にシステム構築することで解決する方向性を示します。

 

一方で、イベントソーシングは既存のシステムイメージとは全く異なる新しい考え方になるため、最初は取っ付きにくく学習難易度は高い。

そのスタートとなるような、イベントの見分け方や適用パターンを具体例を交えて説明されてました。

 

最後は実装パターンの1つとして、アクターモデルの紹介をされていました。

 

スライドは見つけ次第追記させていただきます!

2年間の実運用を経て振り返るイベントソーシングの実際

 

高丘さんからは、自社で作っているSekibanというCQRS+ESを実現するOSSに関する説明や利用・運用実績に関する報告がありました。

現時点で中小規模のシステム事例のみではあるものの、想像よりも運用コストが安かったのが印象的でした。

github.com

 

また中盤のよく聞かれる疑問と、現在の答えに関する部分では、データの一貫性や非同期前提による結果整合性に関するお話がありました。

ビジネス上のアーキテクチャ特性として、設計要件に含める必要があり、

既存システムのリプレイスやリアーキテクトでイベントソーシングに載せ替える際に1つの障壁になり得ると感じました。

そこの部分をどうユーザコミュニケーションするのかは予め詰めておかないと後でシンドイことになりそうなので注意が必要かもしれません。

 

それにしても、自前のOSSを使って受託開発に臨む姿勢は、同じ受託開発を経験していた身からすると背筋が伸びる思いでした。

いろんな機能をCQRS+ESで作ってみたので皆で所感を見てみよう

 

成瀬さんからは、実際にJava+Axon Frameworkを使ったシステムを動かしながら、コードの解説をしていただきました!

 

おそらくJava界隈の方は多くなかった印象ですが、私にとっては実家のような安心感があって最高でした。

成瀬さん「Javaならみんな読めますよね??」

 

イベントの順序性に関して気になってポストしたところ、セッション後に回答いただきました!Axon便利!

 

イベントの削除はしないで、個人情報の削除っぽいことを実現する方法も、なるほど〜って感じで聞いてました。勉強になる📝

 

Axonのカンファレンスがあるの知らなかった・・

www.axoniq.io

 

余談ですが、この秘密兵器セッション中もずっと付けてて、序盤slidoの質問が大喜利大会みたいになってたのが面白かったですw

ステップバイステップではじめるES、CQRS

鈴木さんの発表は、実際に数年CQRS+ESのソフトウェアを開発運用した経験に基づく知見や勘所の紹介がありました。

直前に方針変更をされたとのことで、セッションタイトルは変わっていました。

 

ECサイトを例にしたモデリングの紹介や、実際の設計紹介が同じコンテキストを扱う身としてはとても参考になりました!

 

きのこ→たけのこ 面白かったので、スライド公開を楽しみにしておりますw

 

こちらも見つけ次第追記させていただきます!

アクターシステムに頼らずEvent Sourcingする方法について

 

メインセッション最後はかとじゅんさんから、アクターシステムを使わず自前でイベントソーシングを実装する手法の紹介がありました。

 

最初は全体のシステム構成図を見ながら必要な機能を丁寧に解説していただき、その後アクターモデルを使わない、AWS方式とKJ方式の紹介がありました。

 

AWS方式

aws.amazon.com

 

KJ方式

github.com

 

KJ方式については、コマンド側を中心に実際のコード例を見ながらかなり詳しく説明されてました。

次回、コマンドとクエリの連携編が待ち切れないです。

パネルディスカッション

事前に質問を募って、それに回答する形で進みました。

Ask the Speakerもそうだが、こんな豪華なメンバーに無料で相談やアドバイス貰えるって冷静に考えると贅沢過ぎる時間ですよね・・w

 

 

イベントソーシングしてて、外部IFをRESTにするとリソースの概念とコンフリクトしがちってのは確かに・・ってなった。。

なんとなくしっくりこなくてカスタムメソッドを検討したことがあったな〜

LT

LTはそれぞれ実際のサービスでCQRS+ESを実践している内容中心で、もうこんなに活用事例があるんだと驚きました・・!

ドラの音が思いのほか優しかったのが印象的でした。

 

 

 

 

 

 

懇親会

懇親会では、ビールとハイボール、ソフトドリンク、肉魚野菜スイーツがそれぞれ小皿になっているおしゃれなオードブルが振る舞われました。(写真撮り損ねました> <)

 

申し込みサイトが別れていたせいなのか、次の日PHPのイベントが控えていたせいなのか、想像していたよりも懇親会まで残った人は少なかった印象(1割くらい?)で、登壇者の方々や参加者の皆さんとゆっくり交流することが出来ました。

 

高丘さんとは吉祥寺.pmのアンケートでやり取りさせていただいてから念願の初対面を果たすことができ、また、かとじゅんさんとはお仕事で2年弱お世話になってましたが、こちらもリアルでお会いしたのは初めてだったので直接感謝を伝えられて感無量でした> <

 

CとQが分離したパーカー欲しかったけど、じゃんけん大会は敗北。。

次回は物販をお願いしますw

おまけ

会場付近は美味しそうなお店がたくさんありました。

www.tarekatsu.jp

 

懇親会終わり、会場から徒歩1分のつけ麺屋へ。

半分食べたあたりで酢橘を絞ってさっぱりと頂けました😋

tsukemen-tsujita.com

終わりに

CQRS+ESカンファレンスを実現していただいた運営スタッフの皆さま、登壇者の皆さま、そして参加者の皆さま、楽しい時間を本当にありがとうございました!

 

そして、ワガママを言わせて頂くと第二回もぜひ開催お願いしますw🙏

 

僭越ながらブログを書くことで次回開催の一助となれば幸いです。