🎯

イベントソーシング・CQRS 勉強会 #1 開催レポート

に公開

イベントソーシング・CQRS 勉強会 #1 開催レポート

はじめに

イベントソーシングは使ってみるととても有用な技術です。ただ、実際に使ってみるためのハードルが高かったり、概念が難しかったりします。当イベント『イベントソーシング・CQRS勉強会』では、言語や技術を問わずイベントソーシングやCQRSの利点や使い方についてみんなでわいわい話せるイベントを目指しています。

第一回となる今回は『イベントソーシングやってみた報告会』というタイトルで、様々な言語やデータ保存の手法でイベントソーシングを実践してみた方々の発表会を開催しました。フレームワークを使った実装、自前での実装、サンプルコード作成など、多様な視点からの報告が集まりました。

イベント開催の背景

開催を決意するまで

会社としてイベントソーシングを普及していきたいという思いがありました。個人的にすごく良い技術だと思っているのに、まだ十分に話題になっていないと感じていました。

また、自分自身や会社の知名度や規模がまだまだ小さいため、登壇者や参加者が集まるか不安もありました。USに住みながら日本語で主に活動を行っていて、オフラインでのつながりが少ないため、オンラインでありながらオフラインのような繋がりができるイベントを実現したいという思いもありました。

Findy アーキテクチャカンファレンスやCQRS+ES カンファレンスで登壇して、実際の声を聞くことができたことで、イベントソーシングやCQRSに関心を持っている方が多いことを実感しました。また、私自身の発信を見てくださっている方がいることも知り、ある程度の参加(10-20人程度)は見込めるだろうという自信ができました。

USのカリフォルニアに住んでいるため、日本の夕方4PMが現地では真夜中0AMになるという時差の問題もありましたが、これを乗り越えて開催することにしました。

事前準備

イベント形式の検討

オンラインイベントの開催方法について、いくつかの選択肢を検討しました:

  • Metalife:勉強会形式に適していますが、画質が悪く、レコーディングが見にくいという課題がありました。料金は50人で11,000円、100人で22,000円でした。
  • Zoom:録音は可能ですが、雑談をするような親密な雰囲気を作りにくいと感じました。

どれか1つのプラットフォームでは完全に目標を達成できないと判断し、複数のプラットフォームを組み合わせることにしました。Metalifeの有料版ではリンクを設置できることに気づき、ストリーミングと雑談を別のプラットフォームで行う方針を立てました。

ストリーミングサービスとしては、Riverside.fmとStreamYardを検討しました。どちらも独自サイトでのストリーミングおよび映像の書き出しに対応していますが、調査の結果、Riversideは画質が良さそうだったため、こちらを採用しました。

ただし、Riversideをメインのconnpassページに直接リンクすると、視聴者がRiversideだけに集まってMetalifeに人が来ない可能性を懸念しました。そのため、まずMetalifeに入ってもらい、そこからRiversideのリンクにアクセスする形式にしました。

コンテンツの準備

イベントのコンテンツとしては、イベントソーシングとCQRSのベテランというよりも、これまであまり発表していない方々が発表できる機会になればと考えました。

アクターモデルやイベントソーシングについて試行錯誤をよく発信されていた榊崎リシェラさんに15分の登壇をお願いしました。また、社内メンバーで私と一緒にSekibanの設計をしている川江さんにも15分の登壇をお願いしました。

一般募集としては、15分の発表を1本と5分のLTを5本としました。公開後、早い段階でLTの5枠が埋まったことには驚きました。最終的に2週間前の段階で15分の追加発表の応募がなかったため、私自身がAIプログラミングとイベントソーシングの親和性について話すことにしました。

運営体制

2つのプラットフォームで同時に会話ができる状況を管理するため、社内の方々にスタッフをお願いしました。Metalife側で参加者に声をかける担当を2名、Riverside側で管理をする担当を1名配置しました。

当日は16:30開始のため、15:00から社内でリハーサルを行い、16:00から登壇者のマイクとスライドのチェック、そしてMetalife会場のオープンを行いました。Metalifeに関しては当日に有料版の申し込みをしましたが、実際には数日前に申し込んで会場の準備をすることもできたと思います。Metalifeの有料版ではリンクを設置したり、管理者を設定して管理者だけがスピーカーとして話せるようにしたりできるため、有料版にして良かったと思います。

当日のマイクチェックでは、Riversideがブラウザから参加するため、ブラウザの権限がなくて入れなかった方やマイクの音が最初出なかった方もいました。30分前から開場してリハーサルができたのは良かったと思います。

イベント当日

Riversideで配信を聴くためには、Metalifeに入ってリンクを探し、そのリンクから別タブでRiversideを開く必要がありました。これは少し面倒だったため、次回はRiversideのリンクもconnpassページに直接貼っても良いかもしれません。

問題として、Riversideでの配信音声のボリュームが低いという課題がありました。最大にボリュームを上げないと聞こえないという状況でした。これは配信者のボリュームではなく、Riverside側でのボリューム管理のバグのようでした。ノイズキャンセリングなどをRiverside上で設定していると音が小さく聞こえるという報告がウェブ上にあったため、次回はこの点を調整したいと思います。

タイムテーブル

当日は以下のタイムテーブルで進行しました:

オープニング

イベントソーシングによってインピーダンスミスマッチから解放された話 tkawaeさん

川江さんは社内でDDDを行った時も、無駄な詰め替えが発生することに関する問題意識を常に持っておられ、て詰め替えによって発生するインピーダンスミスマッチをどのように解決していくかと言うことが積板の開発時にもかなり議論されました。結果としてステートを保存するオブジェクトデータベースのスタイルではなくて、イベントを保存することによって、インピーダンスミスマッチをかなり減らすことができていると言うことが言語化されて、とても貴重な登壇だったと思います。

https://x.com/kazu_kichi_67/status/1900452954169020758

RustでCQRS+ESを勉強してみた話 榊崎リシェラさん

Rustで既存ライブラリを使うのではなくて、1からイベントソーシングCQRSそれに加えてアクターモデルも実装をやってみたと言う話でとても難しいことを挑戦して、ときには失敗して後戻りもしながら最終的に使えるものとして形に残したと言う非常に貴重な話でした

https://x.com/ponyoxa/status/1900456851684417568

https://x.com/shin_developer/status/1900459350826840232

Cline+Sonnet3.7 でイベントソーシング開発をやってみた tomohisa

最近行っているLLMを使ったプログラミングでイベントソーシングが簡単に開発を開始できると言う話です。当日11時にアンケートシステムを作って4時の登壇に間に合ったら面白いだろうなと思って作り始めたのですが、何とか形にすることができました。実際にコーディングをしてほしいと言うフィードバックもあったので、次回はそれも行えるようにしてみたいと思います。

https://x.com/upopoipopoi/status/1900464484155883710

RubyでCQRSをやってみた 鈴木まー さん

ご自身の使っておられるRubyでイベントソーシング、そしてCQRSをやっていくにあたり、まず何が大切なのかそしてすべての機能を実装すると大規模になってしまうので、シンプルに考えてまず1部の機能から実装を始めると言う実践的な話でした。

https://x.com/noru86kawaii/status/1900467438208319806

CQRS・ES by event-store-adapterでぶち当たった悩み3選 Lemonadeさん

作ってみての改善を言語化したと言う点でとても貴重な話でした。特に1からフレームワーク的なものを実装しようとしたときに、簡単なものができるまでのコードがすごく複雑になってしまうと言うのはよくある話です。また集約の分け方、そしてイベントソーシングを使うところと使わないところの切り分けなども非常に慣れが必要なのですが、この話で実際に使ってみてのフィードバックがあったのでとても興味深かったです。

https://x.com/memetics10/status/1900468913693192546

ステートソーシング+イベント駆動からみたCQRS+ESの良さ Shinnosuke Hirotaさん

イベント駆動的にドメインイベントを作ってそれを使用してステートを更新していくと言うタイプのイベントの活用法に関するお話でした。イベントソーシングを採用しなくてもイベントを作ることによって、サービスの連携が良くなると言う利点を感じているというのが良かったですし、せっかくイベントを作ってるのだから、イベントソーシングまで採用したいと言う気持ちもよく見えました。ただ、環境によっては根本的なアーキテクチャーを変えられないところもありますので、現実的な解決策だと思いました。

https://x.com/upopoipopoi/status/1900470971108295044

なぜEvent Sourcingを選択したのか 〜事実に基づくことの重要性〜 takuuuuuuu777さん

こちらの話は、鍵の開け閉めに関するドメインにどのようにイベント送信を採用する決定をしていったかと言うことが発表されましたが、タイトルにもある事実に基づくことによって不整合を防ぎドメインをクリアに表現することができるということが、とてもわかりやすく発表されました。社内でももっと長い話を聞きたいと言うフィードバックもありました。

https://x.com/ponyoxa/status/1900472244255740334

Go言語でCQRS+ESのアプリを作ってみた Kizukuさん

12月のCRS Eカンファレンスで学んだことを年末年始の休みで実装すると言う。さすがの行動力だと感じました。protobuf を使用したシリアライズ、またOneOfを使用したイベント定義のあたりのコードがとても綺麗で参考になりました。

https://x.com/shin_developer/status/1900473587552981418

クロージング

https://x.com/turtton/status/1900491391194800385

https://x.com/Yeah_Snob/status/1900515840904376720

YouTube公開について

Riversideの画質がとても良かったのは大きな利点でした。また、編集をローカルではなくRiverside上で行う機能があり、自動的に無音部分をカットしてくれたり、ボリュームを調整してくれたりする機能が便利でした。さらに、バックグラウンドを自動で設定してくれたり、レイアウトを調整してくれたりしたため、ウェブ上の編集だけでほとんど完成させることができました。

ただし、無音部分のカットの中には、話者が意図的に入れた間(ま)も含まれており、一部不自然に切れてしまった箇所もありました。この点は次回も調整が必要だと感じています。

今回はすべての登壇者がYouTube公開を許可してくださったため、すべてのパートをアーカイブで視聴できるようになりました。配信とYouTubeアーカイブを別々に管理できるため、配信時だけ公開して、YouTubeでのアーカイブ公開を希望しない方がいた場合でも対応できる点は良かったと思います。

また、Riversideには高画質高音質のビデオを後からアップロードする機能があるのですが、1部登壇者がその高画質ビデオのアップロードに失敗していた部分がありました。しかし、配信に使用した高画質ではないものの、充分聞きできるビデオを使って復旧することもできたのでかなり良かったです。

アップロードしたアーカイブはこちらです。

https://www.youtube.com/watch?v=Uti-v8wnpkc

アフターイベント

メインの配信終了後、Metalifeを約1時間公開して雑談の場を設けました。登壇者同士の会話や技術的な議論が行われ、最初は約20人の方が残ってくださいました。最後まで参加されていたのは10人前後でしたが、様々な言語の特性について話せたり、Daprに関する関心が共有されたりと、有意義な時間となりました。

この雑談を通じて、開発へのモチベーションが高まったり、TypeScriptなどで個人開発者が簡単に使えるソリューションを提供したいという思いが強まったりしました。

次回に向けて

今回の経験を踏まえ、次回のイベントではいくつかの改善点を検討しています:

  1. Metalifeとのリンク連携をより簡単にする方法
  2. Riversideの音声ボリューム問題の解決
  3. 編集時の無音部分カットの調整
  4. より多くの参加者が交流できる仕組みの検討

イベントソーシングをすでに使っているという方から、ちょっと関心があるという方まで、幅広い方々にご参加いただける場を今後も提供していきたいと思います。

次回の開催もぜひご期待ください!

XのPOSTをposfieでまとめました。

https://posfie.com/@tomohisa/p/lpcKtn9

参考リンク

イベントページ: https://sekiban.connpass.com/event/343929/

ジェイテックジャパンブログ

Discussion