前置き
データメッシュが「プロダクトとしてのデータ(Data as a Product)」を扱う原則なら、
イベントメッシュは「プロダクトとしてのイベント(Event as a Product)」を扱う原則です。
そして、イベントメッシュにおいても、「プロダクト」を設計する以上、コンポーネントの凝集・結合原則は、適用できるどころか、それを適用しないと間違いなく破綻するという、極めて重要な設計指針となります。
🚰 アナロジー:市の水道網 (イベントメッシュ)
この設計は、都市の水道網(イベントメッシュ)をどう設計するかに似ています。
最悪の設計(低凝集)
市内の全世帯(全サービス)に、1本の巨大な土管(単一のイベントトピック)を接続します。
「誰かがトイレを流した」イベントも「料理教室が水を使った」イベントも、すべてがこの土管をごちゃ混ぜになって流れます。
その結果、あなたの家(サービス)は、自分に関係ない99%の汚水をフィルタリングし続ける必要があり、まさに衛生地獄です。(私なら絶対にそんな環境で暮らせません。)
良い設計(高凝集)
水道局(ドメイン)は、目的別にインフラを分けます。
「上水道(Cleaned Water Events)」「下水道(Waste Water Events)」「工業用水(Industrial Events)」といった 「意味のある単位」 で流れ(トピック)をまとめるはずです。
日本の水道インフラはこれが常識になってるから、水道水も飲み水として使えます。
「異なるイベント群でも意味のある単位でまとめてみたり」という発想は、この
「上水道」「下水道」という高凝集なコンポーネントを設計する行為そのものです。
コンポーネント原則の適用メカニズム
では、どの原則がどう役立つかを具体的にレビューします。
1. 凝集の原則 (「まとめる」力)
「どのイベントを同じトピック(またはトピック群)にまとめるか?」
原則:閉鎖性共通の原則 (CCP)
メカニズム
「同じビジネスプロセス(例:顧客オンボーディング)に属するイベント群」や
「同じ理由(例:決済ルールの変更)でスキーマが変更されるイベント群」は、単一のドメインイベント・コンポーネント(例:customer-onboarding-eventsトピック)に凝集させるべきです。
事例
CustomerCreated, CustomerAddressVerified, CustomerAccountActivated という3つのイベントは、バラバラに存在すると利用者が混乱します。
これらは「顧客オンボーディング」という単一の責務を共有しています。
そこでCCPに従い、これらをcustomer-onboardingという 高凝集なチャネル(トピック) にまとめることで、消費者は
「このチャネルさえ購読すれば、オンボーディングの進捗がすべてわかる」
と安心できます。
原則:再利用性共通の原則 (CRP)
メカニズム
「あるイベント(A)を購読する消費者の99%が、必ず別のイベント(B)も購読して、手元で組み合わせて(JOINして)使っている」場合、その2つのイベントは凝集度が極めて高いと言えます。
事例
OrderCreatedイベントとOrderLineItemsAddedイベントが別々のトピックで流れているとします。
しかし、Fulfillment(配送)サービスは、注文を処理するために必ず両方を必要とし、
手元で「注文ID」を使って2つのイベントを突合させる複雑なロジックを持つ羽目になります。
CRPは、「そんな非効率なことはやめろ」という指針を教えてくれます。
Orderサービス(生産者)は、これらを1つの高凝集なイベント(OrderPlaced、内部に注文明細リストを含む)として、1つのトピックで発行すべきです。
これにより、消費者の負担(結合の複雑さ)が劇的に下がります。
2. 結合の原則 (「わける」力)
「なぜ、安易に他のトピックを購読してはいけないのか?」
原則: 安定依存の原則 (SDP)
メカニズム
「変更の激しい(不安定な)イベント(例:Webサイトのクリックストリーム)」が、
「変更が許されない(安定した)イベント(例:会計システムの仕訳イベント)」に、依存してはいけません。
事例
もし会計システムが、クリックストリームのイベント(不安定)をトリガーに仕訳を登録する(安定)ような設計になっていたら、Webサイトのレイアウト変更(不安定)のたびに、全社の会計が止まる(安定の破綻)という大惨事になります。
注意点
イベントメッシュでは、この依存関係が非同期で、見えにくいのが厄介です。
どのサービスがどのイベント(コンポーネント)に依存しているかを、イベントカタログや 非循環依存の原則(ADP) を使って厳格に管理することが、データメッシュと同じく必須になります。
結論
上記でやろうとしていることは、データメッシュの時と同じく、アーキテクチャ設計の王道です。
イベントメッシュもデータメッシュも、結局はまとめると「分散システム」です。
そして、分散システムの設計とは、
「何をまとめ(凝集)、どこに(配置)、どう繋ぐか(結合)」
というトレードオフを、合理的な原則に基づいて決定する行為に他なりません。
コンポーネント原則は、その「合理的な原則」そのものなのです。
インラインコード