書籍「実践ドメイン駆動設計」の「13.3 メッセージングを使った統合」の図解を試みる。
13章以前の各章の集大成的な部分もあり、構造が複雑だったので理解を整理する目的と備忘としての目的の為に作成した。
合わせて、お気に入り設計手法の「三要素分析法」と「ドメイン駆動設計」を段階的につなぎ合わせる構成も模索してみた(模索中)。
1 基本設計
三要素分析法を使用して整理する。
データモデリング手法とレファレンスモデル
1-1 業務フロー
1)メインフロー
2-1
- Productを作成する。
- ProductCreatedイベントがEventStoreに格納される。
- CreateExclusiveDiscussionコマンドがExchangeへ向けて配送される。
- Disucussion作成のトラッカーをTCPTrackerへ格納しカウントダウンを開始する。
2-2
- CreateExclusiveDiscussionを受信してForumとDiscussionを作成する。
- ForumCreated、およびDiscussionCreatedイベントがEventStoreに格納される。
- DiscussionCreated通知がExchangeへ配送される。
2-3
- DiscussionCreated通知を受信してProdustにDiscussionを紐付ける。
- ProductDiscussionInitiatedイベントがEventStoreに格納される。
- TCPTrackerにプロセス完了の更新を行う。
2)タイムアウト検知フロー
2-4
- TCPTrackerを参照して、インターバル超過プロセスを抽出する。
- リトライ可能ならばProductDiscussionRequestedイベントが、リトライ上限ならばProcessTimedOutイベントがEventStoreに格納される。
- リトライ可能な場合は、コマンドがExchangeへ向けて配送される。
- TCPTrackerのステータスを更新する。
1-2 データモデル
理想は渡辺式ER図をMarmaidで作図すること。以下は現状できる範囲で図示したイメージ。
1-3 機能モデル
to be created
1-4 業務モデル
to be created
2 詳細設計
まずフレームワークを定義し、次にフレームワークを活用したプロセスの詳細を設計する(プロセスは基本設計の業務フローにあるプロセスのこと)。
2-1 フレームワーク
to be created
2-1-1 イベント発行をサブスクライブしてイベントストアへ格納(EventStoringAspect)
1)データフロー
2)EventStoringAspectのオブジェクトモデル
実践ドメイン駆動設計 p.296 図8-3
※IdentityAccessEventProcessorはAspect(p.297 上の網掛)
2-1-2 イベントストアから収集したイベントをエクスチェンジへ配送(StoredEventForwarder)
1)データフロー
2)StoredEventForwarderのオブジェクトモデル
- NotificationServiceはEventStoreからDomainEventを取得しNotificationを発行する
実践ドメイン駆動設計 P.311 上の網掛
※GitHubではNotificationApplicationServiceとRabbitMQNotificationPublisherの組み合わせで実装されている
- NotificationServiceは定期実行する
実践ドメイン駆動設計 p.315 「発行時の待ち時間に関して言うと」の段落以降
2-1-3 エクスチェンジからメッセージを取得して処理を委譲する(ExchangeMessageDispatcher)
1)データフロー
2)ExchangeMessageDispatcherのオブジェクトモデル
実践ドメイン駆動設計 P.455 網掛
- MessageProducerがExchageへメッセージを発行する
- QueueはExchageからへメッセージを取得する
- MessageConsumerはQueueからメッセージを取得し具体的な処理を実行する
- ExchageListenerはクライアントから見た抽象Consumerとなり、Queueのメッセージを処理する
- 実際はConcreateExchageListenerを実装して使用する
2-1-4 プロセスとプロセストラッカー
1)データフロー
2)Process、TimeConstrainedProcessTracker、およびProcessTimedOutのオブジェクトモデル
2-2 プロセス設計
プロセスを詳細化してアプリケーション・サービスを設計する。
- 点線矢印 直接の依存関係なし。データフローのみ。
- 実線矢印 メソッド呼び出しの関係。基本的には。
2-2-1 Productを作成する
2-2-2 ForumとDiscussionを作成する
2-2-3 ProductにDiscussionを紐付ける
2-2-4 インターバル超過プロセスを抽出してリトライかタイムアウトする
2-3 ドメインモデル設計
ドメインモデルの各要素を詳細化する。
- エンティティ
- 値オブジェクト
- イベント
- etc