イベント粒度:イベント駆動アプリケーションにおけるイベントのモデリング


イベント駆動アプリケーションの構築に興味がありますか?もしそうならば、それは頭がかなり早く頭に戻る1つの問題です;どのように大小のあなたのイベントを行うのですか?

イベント駆動システム


我々が始める前に、イベント駆動システムにいくつかの背景を与えましょう.イベント駆動型システムは互いに同期した呼び出しを行わず、代わりにメッセージをブロードキャストする.他のサービスは、これらのイベントを聞いて、自分の速度でそれらを処理します.サービスが減速したりクラッシュしたりすると言うと、他のサービスは何も間違っていないかのように動作し続けるでしょう.失敗したサービスが再び起動すると、処理イベントに戻り、システムの残りの部分までキャッチします.これは、マイクロサービスベースのアーキテクチャなどの堅牢な、分散システムを構築するための素晴らしい方法です.

それで、あなたがこれらのシステムの1つを建設しているならば、あなたはどのようにあなたのイベントを定義しますか?

イベントのモデリング


イベント駆動型システムを設計するとき、そのシステムの変更を引き起こすイベントをモデル化する必要があります.イベントは、すべてのシステム/サービス間の変更をブロードキャストするために使用されます.
  • 表情豊かな
  • 役に立つ
  • 言い換えると、彼らは彼らが何をするかについて説明する必要があり、消費しやすい情報を含んでいます.それは音よりもトリッキーです、特にあなたが開発されたテーブルの駆動、crud/ormスタイルから来ている場合.

    粒度


    我々のチームにとって、最大の問題はイベントの粒度を考え出していた.どのように小さい/詳細はありますか?あらゆる価値変化のためにイベントが必要ですか?または、我々はユーザー実体のような全実体を放送する大きなイベントを使用しますか?これらは粒状性の質問であり、それに答えるために、我々は粒度のスペクトルを理解しなければならなかった.

    イベントを設計するときは、スペクトル上の適切なポイントを選択する必要があります.あまりにも罰金、イベントは役に立ちません.あまりに粗くて、彼らは表現力がありません.私たちの経験から、本当にそれを得ることができる3つの方法があります.
    粗すぎ
    2 )罰金
    3 )両方のビット

    粗すぎる


    粗いイベントは大きくて一般的です.一般的な名前を持ち、多くのデータを含んでいます.しかし、名前は多くの意味を伝えませんので、何が実際に起こったかを理解するためにデータ自体をチェックしなければなりません.これは、サービスがこれらのイベントを聞く必要があることを意味し、それらが実際に気にするかどうか把握する前に、それらの中のデータをチェックします.これはあなたのドメインからあなたのリスナーにいくつかのロジックを書き込んだサインです.

    粗い出来事


    事件を起こすAccountStatusChanged , を返します.
    AccountStatusChanged
      accountId: 12
      status: "closed"
    
    これは表現的ではないので、粗い出来事です.私たちのプロセスのどれも、状態が一般的に変化した場合気にかけます.アカウントが「閉じられる」ならば、マーケティングサービスは気にかけます、一方、課金サービスがアカウントが「活動している」か「閉じられた」ならば心配します.

    粗事象の修正


    これらの2つの値の変更が異なるプロセスをトリガーするので、2つの慎重なイベントとしてモデル化するのは理にかなっています.
    AccountClosed
      accountId: 12
    
    AccountActivated
      accountId: 12
    
    
    彼らが実際に起こったことについての文脈を与えるので、これらの2つのイベントははるかに有用です.

    なぜこれが起こるのか


    つの理由で、粗い出来事が起こります.
  • 開発者は事前に自分のドメイン内のイベントの数を削減しようとすることによって最適化されています.
  • イベントは、UIのモックアップから、むしろドメインの専門家と話をすると、実際に重要な(我々もこれを行った)を考え出すから作成されました.
  • 細粒の


    細粒度事象は小さくて特異的である.それらは典型的によく名前を付けられますが、ごくわずかな情報を含んでいます.あまりにも細粒度のイベントは、それ自体で有用ではありません.あなたのリスナーが同時に同じシステムによって引き起こされる複数のイベントを聞くならば、それは彼らがあまりに細粒である良いサインです.

    細粒度事象


    次のイベントを行うCustomerFirstnameChanged and CustomerLastnameChanged を返します.
    CustomerFirstnameChanged
      userId: ...
      firstName: "Tim" 
    
    CustomerLastnameChanged
      userId: ...
      lastName: "The Enchanter" 
    
    これらのイベントはあまりにも細粒度です.なぜなら、彼らが独立して起こるなら、サービスを心配しないからです.当社のサービスは、顧客の現在の名前についてのみ注意してください.最初の名前と最後の名前が異なる時間で変わるならば、彼らは気にしません.私たちの電子メールサービスは、例えば、両方のこれらのイベントのためだけでは、ユーザー名を更新することができますリッスン.それです.彼らが別々である本当の理由が、ありません.

    細粒度事象の修正


    上記に基づいて、より良いイベントはCustomerNameChanged を返します.
    CustomerNameChanged
      userId: ...
      firstName: "Tim" 
      lastName: "The Enchanter" 
    
    
    今私たちのリスナーは、仕事をトリガするために1つのイベントを聞いて、はるかに簡単です.

    なぜこれが起こるのか


    グラディエントイベントは、開発者が粗いイベントを回避しようとすると、反対方向にあまりにも遠くに発生します.根本的な原因は同じですが、彼らは実際に重要なものを把握するために、ドメインの専門家と話をしていない代わりに、彼らは推測し、それが間違っていた.

    両方とも


    私はそれが奇妙に聞こえることを知っていますが、また、あまりにも粗く、あまりにも微細な粒の両方のイベントを設計することができます.これらのイベントには多くのデータ(すなわち粗)がある一般的な名前があります、しかし、彼らはそれ自体で役に立ちません、そして、常に他のイベント(例えばあまりに細粒な)と結合されます.彼らはあまりにも粗いとあまりにも1つの素敵な厄介なパッケージに穀物の問題を組み合わせた.

    間違っている


    CustomerFirstnameChanged
      userId: ...
      firstName: "Tim" 
    
    CustomerDetailsChanged
      userId: ...
      lastName: "The Enchanter"
      twitterHandle: "@enchantz247"
    
    上記でCustomerDetailsChanged 問題は、それはあまりにも粗く、あまりにも粒状です.
    それはあまりにも情報が含まれて粗いです.Twitterのハンドル変更を気にするサービスは、人の姓に気を配っていません.しかし、これらのイベントのすべてを聞いて、それが継続する前に実際に変更されたtwitterhandleであることを確認する必要があります.ASPにおける痛み
    それはあまりにも粒状ですそれは完全な画像を得ることができる前に、人の名前を気にすべてのサービスは、両方のイベントを聞く必要があります.これは、粗野な、より表現力の低いイベント名の追加の問題で、上記の細粒度の例と同じ問題に苦しんでいます.ASSのもう一つの痛み.

    正しく得る


    明らかに、我々はデータ境界を間違って得ました;我々は間違ったイベントにデータを持っています、そして、我々のイベントは貧しい名前です.それらを再定義しましょう.
    CustomerNameChanged
      userId: ...
      firstName: "Tim" 
      lastName: "The Enchanter" 
    
    CustomerTwitterHandleChanged
      userId: ...
      twitterHandle: "@enchantz247"
    
    これらのイベントは消費が非常に簡単です.名前について気にする各サービスは、Twitterのハンドルについて気にかけるサービスと同じ1つのイベントを聞きます.ずっと多くの明快さではるかに少ない複雑さ.

    なぜこれが起こるのか


    これは、システム内の新しいデータを処理する必要があるときに発生します.新しいイベントを追加したくないので、既存のイベントにデータを追加するだけです.これは、イベントの粒度の問題を後でよりむしろ修正することが重要である理由です.

    それで、どのように、あなたは甘い点を見つけますか?


    どのように我々は我々のイベントのための右の粒度を見つけるのですか?さて、まず最初に一歩を踏み出すと、実際にはドメインの専門家と話をする必要があります.彼らはすでに境界を知っています、彼らは何年もの間メッセージを送っていて、何が重要であるかについて理解しています、そして、何がそうでないか、一緒に属して、何が別々であるかについてわかっています.

    開始する最良の方法は、いくつかの時間を過ごすことですevent storming それらとあなたのドメイン.どのようなメッセージ(IE . Events)を自分の部門(IE . Service)の内部で使用し、どのようなものが他の部門のプロセスをトリガーするために使用されるかを把握します.それは注意することが重要です、あなたはあなたの最初のESセッションの右側にそれを取得するつもりはない、それはOKです.あなたのドメインについてのあなたのドメイン専門家とのセッションのカップルをあなたのモデルで繰り返してください、あなたはより良いイベントを発見して、上記の問題を避けるでしょう.
    これは多くの努力のように聞こえるし、むしろコーディングを開始したい場合は、この引用を念頭に置いてください.

    Weeks of coding can save you days of planning.


    言い換えれば、まずは、定義されていないイベントが途中で取得し始めると途中ではなく、初めにイベントを発見する方が良い.それは正面に大きなデザインについてでありません.ホープは、この便利で幸せなコーディングを発見!