マイクロサービスとドメイン駆動設計(DDD)、と言えば境界づけられたコンテキストが話題に上がる。確かにマイクロサービスの粒度を定義する上で境界づけられたコンテキストは基礎となる道具だが、他のコンセプトも重要だ。Michael Plöd氏はベルリンで開催されたmicroXchgカンファレンスのプレゼンで、DDDは単にエンティティや値オブジェクト、リポジトリというだけではない、と言い、マイクロサービスを設計する上でのDDDの使い方について説明した。
innoQでプリンシパルコンサルタントを務める氏は、DDDは4つの領域でマイクロサービス開発の役に立つという。
- 戦略的設計は主に境界づけられたコンテキストのことだが、コンテキストマップや他のパターンも重要。
- 内部の構成要素。エンティティや集約、リポジトリは境界づけられたコンテキストの内部の設計に使われる。
- 大規模な構造。責務レイヤを使った構造化。
- 蒸留。すでに成長したシステムからコアドメインを蒸留する。
どのような洗練されたビジネスドメインであれ、ひとつ以上の境界付けられたコンテキストで構成されており、それぞれがドメインの一部の責務を担う。境界付けられたコンテキストはドメインを記述するモデルが含み、また、それらのモデルの意味的な境界にもなる。顧客という境界付けられたコンテキストであれば、その中に顧客のモデルとビューを含む。Plöd氏はこれによって独立したマイクロサービスが実現できると考えている。
コンテキストマップはすべての境界付けられたコンテキストを示し、それぞれの関連と契約を記述する。マイクロサービスに移行したい組織にとっては、コンテキストマップはとても便利だ。未来の転換にとってのスタートポイントにもなる。よくある関連のパターンには以下のものがある。
- 共有カーネルはふたつのコンテキストやモデルがドメインの一部を共有するというパターン。氏はこのパターンでは依存が強まる、と指摘している。
- カスタマー – サプライヤ。ひとつのコンテキストがカスタマーとして振る舞い、サプライヤコンテキストの機能を使う。
- 防腐レイヤ (ACL)。クライアントのモデルを他のモデルから分離する変換層。マイクロサービスや自己内蔵システム(SCS)へ移行する場合に役立つ。ACLが外に対する防護壁になるからだ。
内部の構成要素については、氏は集約の重要さを指摘している。集約は一括して扱うドメインオブジェクトの集まりで、集約のルートであるひとつのエンティティを通じてすべての処理が行われる。
柔軟でないアーキテクチャやシステムが複雑すぎる場合、境界付けられたコンテキストにまたがった大規模な構造を作り、その構造を高いレベルのコンセプトを理解するために進化させると助けになるかもしれない。Plöd氏は、この考え方はマイクロサービスの中核のアイディアのひとつだと指摘する。進化できるように設計するという考えだ。責務レイヤもまた、構造的なパターンであり、境界付けられたコンテキスト内に、責務に応じた内部構造を作る。しかし、このコンセプトはマイクロサービスの構造化にも適用できる。
古いシステムからマイクロサービスや自己内蔵システムへ移行する場合、既存のモノリシックなシステムからマイクロサービスを抽出するのに使えるのが蒸留だ。コアドメインを特定し抽出し、サブドメインを特定し、コアドメインから取り出して、最後に内部をリファクタリングする。Pödl氏は業務とコアドメインの詳細について文書かしておくことを強調する。業務に対する明確なビジョンと知識がないと最適なコンテキストを見つかられない可能性が増えるからだ。
マイクロサービスとDDDは相性が良いが、幅広い視点を持ち、境界付けられたコンテキストの向こう側を見ることが必要だ、というのが氏の意見だ。
Rate this Article
- Editor Review
- Chief Editor Action