非同期的メッセージングパターン

(同期/非同期)リクエスト/レスポンスの実装

クライアントとサービスの間で対になるメッセージをやり取りする形でインタラクションを実装する。メッセージングを用いているため、非同期的な通信になるが、リプライがあるまでブロックすることで同期的に通信ができる。

  • リクエストのメッセージで相関IDとリプライを返すためのチャネルを設定してチャネルに送信する
  • リプライでは、リクエストでしていされた相関IDを設定してリプライチャネルに送信する
  • クライアントは、リプライチャネルから相関IDに一致するメッセージを取得する

パブリッシュ/サブスクライブの実装

ドメインオブジェクトに変更が加えられたことを表すドメインイベントをパブリッシュするために使う。
チャネルはドメイン名から作ったものにする。特定のドメインオブジェクトに関心を持つサービスが適切なチャネルをサブスクライブするだけでイベントを検知できる。

パブリッシュ/非同期レスポンス

前述の2つを組み合わせたインタラクションスタイル。

  • クライアントは、相関IDとリプライチャネルを指定したメッセージをパブリッシュする。
  • コンシューマ(メッセージの消費者)は、相関IDを含んだメッセージをリプライチャネルにパブリッシュする。
  • クライアントは、相関IDを使ってリプライメッセージを集める

非同期メッセージングでサービス間のトランザクションを保つ方法

  • Transactional outbox パターン
    • レコードの変更をOutboxテーブルに保存してイベントを同一トランザクションで保存することで、イベントが発行されることを担保する
  • Poling publlisher パターン
    • Outboxテーブルをポーリングしてメッセージングをパブリッシュする
    • DBへのアクセス負荷が高くなる可能性がある
  • Transaction log tailing パターン
    • データベースのトランザクションログをログマイナーで読み取り、変更点をメッセージブローカーにパブリッシュする
    • データベース固有APIを呼び出す低水準コードを書く