0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

イベントメッシュとコンポーネントの原則

Posted at

前置き

データメッシュが「プロダクトとしてのデータ(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) を使って厳格に管理することが、データメッシュと同じく必須になります。

結論

上記でやろうとしていることは、データメッシュの時と同じく、アーキテクチャ設計の王道です。

イベントメッシュもデータメッシュも、結局はまとめると「分散システム」です。

そして、分散システムの設計とは、

「何をまとめ(凝集)、どこに(配置)、どう繋ぐか(結合)」

というトレードオフを、合理的な原則に基づいて決定する行為に他なりません。

コンポーネント原則は、その「合理的な原則」そのものなのです。

インラインコード

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?