コンテキスト境界やメッセージングといったドメイン駆動設計(DDD)の概念を使用すれば、ビジネスの変化に合わせて拡張可能な、信頼性の高いシステムを構築することができる。Indu Alagarsamy氏は先日のQCon New York 2019 Conferenceで、明確に定義されたコンテキスト境界とイベントを組み合わせて使用することによって、ビジネスの変化に柔軟に対応可能な、自律的マイクロサービスの開発について講演した。
メッセージングのテクノロジを導入して、クリーンで明確に定義されたコンテキスト境界間のコミュニケーションを実現することにより、一時的なカップリングを排除することができる、とAlagarsamy氏は言う。コンテキスト境界が明確さを提供することで、各コンテキスト境界内のモデルは論理的な一貫を持ち、自由に進化することが可能になる。
ユースケースの一例として氏は、"プロダクト"をコアエンティティのひとつとするEコマースアプリケーションについて論じた。この場合、プロダクトエンティティはコンテキストをベースとしており、次のようにドメインチームごとに異なる意味を持つ。
- Sales: 説明、イメージ、価格を持つ
- Inventory: 利用可能か、あるいは不可能なもの
- Shipping: 重量と寸法があり、梱包が必要なもの
このため、統一的なモデルの構築や、ビジネスドメイン間の適切な境界の設定は困難を伴うものになる。これに対して氏は、モデルをよりオーガナイズする方法として、ドメインモデルをチームや部門によって分割することを提案する。あるいは、システム内のビジネスプロセスに沿った分割も考えられる。
Alagarsamy氏は航空会社のアプリケーションを例にとって、境界付けられたコンテキストが相互に通信する方法について説明した。
続いて氏は、イベント駆動型マイクロサービスの2つの重要なコンポーネントである、コマンドとイベントについて説明した。イベントは、境界の異にするコンテキスト間の通信メカニズムとして有用であり、コンテキスト境界間の一時的な結合を最小限に抑えるのに役立つ。一方でコマンドは、単一のコンテキスト境界内の通信スタイルとして使用することが可能だ。イベントとコマンドをモデル化することで、コードの記述がはるかに簡単になる。
要件収集フェーズでは、ビジネス要件の説明からキーワード"when"を探す。通常はこれがビジネスイベントを示すものだからだ。氏は、航空会社のアプリケーションでのイベントから、いくつかの例を論じた。
航空機のタイプが変更されたとき(when):
- 乗客には新たな予約提案が通知される。
- 乗客はフライトをキャンセルするこどができる
- 乗客は提案された予約を受け入れることができる。
さらに氏は、アプリケーションにおいて、イベントとメッセージがビジネスプロセスにどのように関連付けられるかについても話した。ビジネスプロセスは、別のコンテキスト境界からのイベントによって起動することができる。ひとつのビジネスプロセスには、複数のメッセージが関与することが可能である。メッセージの設計時には、パブリックなセッタを排除することによって、メッセージを不変(immutable)にする。その代わりに、ドメインクラスの構築時にプロパティを設定するのだ。
sagaパターンを使用すれば、同じトランザクションに参加する複数のメッセージを管理することができる。このパターンでは、ビジネスプロセスのいずれかのステップが成功しなかった場合に、補正アクションを実行することが可能である。
全体的な要件分析におけるもうひとつの重要なステップはイベントストーミング(event storming)だ。イベントストーミングは、開発チームとビジネス上のステークホルダが、複雑なビジネスドメインを調査するために使用するコラボレーションテクニックである。イベントストーミングのテクニックを採用したドメインモデリングは、イベントがいつ発生したか、アプリケーションがどのアクションを実行すべきか、を特定する上で効果があり、コマンドをイベントに対応させることが可能になる。
ドメインモデルのさまざまな要素に対して、適切な命名規則を使用することも重要だ。コマンドハンドラに適切な名前を付け、コードレビューやピアレビューにおいてその名前を確認するようにしたい。イベント、クラス、ハンドラの言語や名前も確認が必要だ。
モデルは完全ではないので、チームはプラクティスに従って、ドメインモデルがビジネスの目的や要件と適切に一致するようにする必要がある、と述べて、Alagarsamy氏は自身のプレゼンテーションを締め括った。
- ドメイン専門家との対話。彼らとのイベントストーム。
- ドメイン言語に拘った進化とリファクタリング。
- 自律を目指す。コンテキスト境界間の通信へのイベントの使用。
ドメイン駆動設計の話題に興味があるならば、Eric Evans氏によるオリジナルブックや、最近出版されれた"Domain-Driven Design: The First 15 Years"という書籍を参照するとよいだろう。特に後者には、Indu Alagarsarmy氏を含むDDDコミュニティのリーダによるエッセイや、Service Modelingワークショップについて記載されている。