「境界づけられたコンテキスト」と「コンテキストマップ」
DDDではシステムをひとつの大きな固まりではなく、ビジネス的な境界線(ユビキタス言語の境界線)にあたる「境界づけられたコンテキスト」の単位で分割して管理することを2章で紹介しました。この「境界づけられたコンテキスト」の関係を示す図が3章で紹介した「コンテキストマップ」となります。
コンテキストマップは、モデルの変更が影響を与える「上流(U)」とモデルの変更の影響を受ける「下流(D)」といった関係を示しつつ、相互にどのような方法で結合しているかを示します。上図では「認証・アクセスコンテキスト」「コラボレーションコンテキスト」「アジャイルプロジェクト管理コンテキスト」といった3つの関係を説明しています。
本稿では、これらのコンテキスト間での連携に必要な「分散システムの原則」「データ交換フォーマット」「Notification(通知)の仕組み」「RESTアーキテクチャ」「メッセージングアーキテクチャ」について紹介していきます。
分散システムの基本
まず「境界づけられたコンテキストの統合」において重要な概念となる「分散システム」の設計指針から確認していきましょう。DDDで複数の「境界づけられたコンテキスト」が存在する場合、通常それらは分散システム構成となります。
分散システム構築時の原則
分散システムの構築は一般的な集中システムに比べると簡単ではありません。そのため開発者は次の「分散コンピューティングに関する原則」を理解する必要があります。
- ネットワークは信頼できない
- ある程度の(時にはかなりの)遅延が常に発生する
- 帯域幅には限りがある
- ネットワークはセキュアではない
- ネットワーク構成は変化する
- 管理者は複数人存在する
- 転送コストはゼロではない
- ネットワークは一様ではない
この原則は、元サン・マイクロシステムズのドイチュ氏による「分散コンピューティングの落とし穴(参照:ウィキペディア)」として知られている内容を、IDDD本で逆に書き直した「原則」となります。
コンテキスト間の「データ交換フォーマット」
異なる「境界づけられたコンテキスト間」で情報を受け渡す場合、相互に解読できるデータ形式が必要になります。そのため、データ交換用のフォーマットを取り決める必要があります。IDDD本では「(1)共有カーネル」「(2)プログラム言語のシリアライズ機能の利用」「(3)中間フォーマット(JSON等)」「(4)カスタムメディアタイプ」といった4方式を示しています。
(1)共有カーネル
最初のデータ交換フォーマットとしては、3章にて紹介した「共有カーネル」が存在します。これは複数のコンテキスト間で同じソースコードを共有する方法です。しかしこの方法は、片方のコンテキストの変更が他のコンテキストに大きな問題を引き起こす危険性があるため、あまり使用しないほうが良いとされています。
(2)プログラム言語のシリアライズ機能
2番目の方法は、プログラミング言語(JavaやC#)の機能を使う方法です。これは、オブジェクトの情報をバイナリ形式でシリアライズして連携します。復元側でも同じプログラミング言語を使っている必要があります。さらに、異なるハードウェアや言語バージョンでも正しく復元できる必要があります。そのため他のプラットフォームとの接続などを考慮すると懸念点があります。
(3)中間フォーマット(JSON等)
3番目の方法は、標準化されている中間フォーマットを利用する方法です。主要なフォーマットとしてXML、JSON、Protocol Buffers等が存在します。それぞれ、サイズ/型変換/複雑なデータの扱い/バージョン互換においてメリットとデメリットが存在するため、プロジェクトに応じて採用するフォーマットを検討すると良いでしょう。
(4)カスタムメディアタイプ(MIMEタイプ)
4番目の方法として、標準規格に基づいた手法で定義できる「カスタムメディアタイプ(MIMEタイプ)(参照:ウィキペディア)」を利用することができます。
IDDDでは、RESTサービスに対するリクエストをJSONで戻す際に、以下のMIMEタイプによるレスポンスを返しています。
- application/vnd.saasovation.idovation+json
- application/vnd.saasovation.projectovation+json
- application/vnd.saasovation.collabovation+json
この「vnd.」というプレフィックスは「ベンダーツリー」と呼ばれ、公開されている製品に関連するメディアタイプとして用いられます。SaaSOvationのような公開サービスでは「公開された言語」の一部としてカスタムメディアタイプを定義しています。
以上、4つのデータ交換フォーマットについて紹介しました。