非同期メッセージングを使ったインテグレーションパターン (EIP)は、クラス設計にも参考になるものが多い。 すぐに非同期メッセージングを使わないとしても、EIPは設計の参考情報として知っておきたい。
アプリケーションの設計にEIPの知識が役に立つよ!2022年2月9日有限会社 システム設計 増田 亨現場から学ぶモデル駆動設計 第10回2022/2/9 1
View Slide
アプリケーション間の連携• いま時は、Webアプリケーションは孤立していることはほとんどなく、他のサービスと連携している• 連携方法は“Web API”(HTTP リクエスト/レスポンス)の同期方式が主流• 非同期メッセージング “pub/sub”も連携方式の選択肢としてだいぶ使いやすくなってきたが、普及はこれから2022/2/9 2
アプリケーション設計とメッセージ処理• Webアプリケーションは、HTTPリクエストやHTTPレスポンスをメッセージと考えると、メッセージ処理の一形態• データベース操作も、レコードをメッセージと考えるとメッセージ処理の一形態• 非同期メッセージングのミドルウェアやサービスを使わなくても、EIPはアプリケーションの設計パターンとして参考になる2022/2/9 3
Web アプリケーション設計とEIP• EIP のパターンはクラス設計の参考になる• 特にアプリケーション層・プレゼンテーション層・データソース層では、EIPのメッセージ処理の考え方がいろいろ使える• 私がクラス設計によく使うEIPのパターンを8つ紹介します2022/2/9 4
処理の構造化(クラスの役割分担)のパターン2022/2/9 5
関心事の分離:並列化プロセスマネージャーリクエストたばね役に専念するクラス機能特化のクラス群ひとつのクラスでなんでもかんでも抱え込まないようする機能の追加・修正が楽で安全2022/2/9 6
関心事の分離:直列化リクエスト 通知/記録パイプとフィルター前処理クラス 中間処理クラス 後処理クラス・段階ごとに別のクラスが処理をする・呼び出しは void型のメソッド (リターン値はない、副作用があることの明示)・中断は例外を発生させる・例:データベースへの書き込み、メール送信による通知機能の追加・修正が楽で安全2022/2/9 7
関心の分離:分岐リクエスト分岐判定に専念するクラス適切なクラス/外部サービスに処理を任せるコンテントベースの経路分岐機能の追加・修正が楽で安全・分岐役と処理役の分離リクエストの内容により分岐先を切り替える(ディスパッチャー)2022/2/9 8
ソース⇒分割⇒振分け⇒個別処理⇒集約インバウンド アウトバウンド複合メッセージの処理ひとつのメッセージに複数の情報が混在している時最初に分割して処理を振り分け、結果を集約する最初に分割して中間を単純化2022/2/9 9
メッセージ内容(情報)の扱い方のパターン2022/2/9 10
エンリッチ:必要な情報を付加するユーザーIDを受け取り、ユーザ情報を付加して後続処理に渡す予約番号を受け取り、予約内容を付加して後続処理に渡す前準備を分離して後続処理を単純化する2022/2/9 11
フィルター:不要な情報を取り除くひとつのメッセージが多様な情報を含んでいる時後続処理に必要な情報だけ渡す前準備を分離して後続処理を単純化する2022/2/9 12
荷物を預かり引換券を渡す大きな情報を持ち歩くのをやめていったんデータベースに記録し、引換券(キー)を渡すヘッダー情報はそのまま引き渡していく手荷物預かりサービス データ渡しを単純化する2022/2/9 13
データ形式の正規化形式がふぞろいのデータを共通の形式に変換して後続処理に渡す前準備を分離して後続処理を単純化する2022/2/9 14
Web アプリケーション設計とEIP• EIP のパターンはクラス設計の参考になる• 特に、アプリケーション層・プレゼンテーション層・データソース層では、メッセージ処理の考え方がいろいろ使える• 非同期メッセージング方式の導入もやりやすくなる2022/2/9 15