イベントファーストのドメイン駆動型設計(DDD)とイベントストリーミングは、マイクロサービスベースのアーキテクチャでは重要であるとLightbendの創設者兼CTOであるJonas Bonér氏が述べた。同氏は先週、QCon New York 2018 Conferenceで、回復力がありスケーラブルなアーキテクチャを構成するために、イベントファーストのデザインを用いることについて話した。
彼は、マイクロサービスの旅を始めるときには、「マイクロリス」で終わらないように注意しなければならないと述べた。なぜなら、モノリシックデザインから悪い習慣をマイクロサービスにもたらす可能性があるためであり、それによってサービス間の強い結合を生み出すことになる。イベントファーストの視点を持たないDDDアプローチは、誤った道に導く可能性がある。物事(ドメインオブジェクトのような名詞)に集中するのではなく、システム内で何が起こるか(イベントのような動詞)に焦点を当てるべきである。
イベントとコマンドに基づくマイクロサービスアーキテクチャは、システムの回復力、スケーラビリティ、トレーサビリティ、および緩やかな結合を支援する。イベントは、過去に発生した事実を表す(たとえば、OrderCreated
、ProductShipped
)。イベントは無視できるが、取り消しや削除はできない。また、新しいイベント/事実がシステムに到着し、既存の事実を無効にすることができる。一方、コマンドは、メソッド/アクションのオブジェクト形式である。それらは命令である。コマンドの例は、CreateOrder
とShipProduct
である。
Bonér氏は、イベントを使用して、システム内の限定されたコンテキストを定義することを提案した。イベント駆動型サービスは、事実を受け取って反応し、新しい事実をシステム内の他のサービスに公開する。また、ドメインデータの整合性と一貫性を維持するために使用されるAggregateデザインパターンについても説明した。それは失敗の単位でもあり、完全自律である。イベントストリーミングはマイクロサービスアーキテクチャで重要な役割を果たし、サービス間の通信ファブリックとして使用できる。統合、複製、コンセンサス、永続性などの機能向けのファブリックとしても使用できる。
データの永続性に関して、CRUDサービスは完全に分離されたデータに対しては問題ないが、CRUDサービス間で一貫性を保つことは非常に困難である。アプリケーション設計の初めから結果整合性に頼らざるを得ず、必要な場合にのみ、強い整合性を使う必要がある。また、不確実性に対処するためにシステムのモデリングの重要性についても議論した。不確実性の管理はビジネスロジックに実装する必要がある。イベントは、障害を回避するのではなく、障害の管理に役立つ。CRUDサービスをイベントストリームと共に使用して、内部的に一貫したマテリアルビューを得る。
イベントロギングとイベントソーシングは、スケーラブルなマイクロサービスアーキテクチャの実現にも不可欠である。トランザクションログがリレーショナルデータベースで使用されているのと同様に、イベントログが根幹であり、スケーラビリティ、信頼性、整合性を保つために役立つ。イベントソーシングは、マイクロサービス間における結果整合性の助けとなる。また、イベントログからイベントを「再現(rehydrating)」することで障害から復旧する助けになる。また、他の人が状態変更をサブスクライブすることができるようになる。また、CQRSデザインパターンを使用して、読み書きモデルの複雑さを解消することができる。システム内の読み取りは、書き込みとは全く異なる特性を持つことがある。
Bonér氏は、イベントファーストデザインが、回復力のあるスケーラブルなアーキテクチャと自律的なマイクロサービスの設計を作成する助けとなると述べて、プレゼンテーションを結論付けた。イベントロギングでは、CRUDとORMを避け、システムの履歴を管理し、強い整合性モデルと結果整合性モデルのバランスを制御できる。
Akkaフレームワークは、これらのパターンを実装するための優れたソリューションである。イベントファーストマイクロサービスの詳細については、Reactive Microsystemsというミニブックを参照してください。
Rate this Article
- Editor Review
- Chief Editor Action