勉強日記

チラ裏

LaravelでFanoutパターン


ユースケース

  • あるアプリケーションで発火した1つのイベントを複数のアプリケーションでサブスクライブしたい
    • CQRSとかで

ソリューション

f:id:wand_ta:20200423235900p:plain

Laravel用ライブラリ

github.com

サンプルアプリケーション

github.com

  • terraformで立ち上がるSNS/SQSインフラ一式
  • アプリケーション2つ
    • app_a: publisher / subscriber
    • app_b: subscriber

処理の流れ

  1. ユーザがapp_a/publishにアクセスする
  2. app_aSNSメッセージをトピックにpublishする
  3. SNSapp_a,app_b用のSQSキューにメッセージを複製してpushする
  4. app_a, app_bのジョブワーカーは自分のSQSキューのメッセージをpullする (subscribe)
  5. app_a, app_bは、メッセージに含まれているSNSのarnから実行すべきジョブを特定し、ジョブを実行する。

ジョブの特定のためにarnや決めのフィールドの値(このライブラリではSubject)を使うのがミソのよう。

hackernoon.com

Laravel Worker

one interesting option is to tie the SNS Topic ARN to a specific Job class.