LaravelでFanoutパターン

CloudDesignPatternLaravel

ユースケース

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

    • CQRSとかで

ソリューション

  • AWS SNS + AWS SQS の Fanout Pattern

20200423235900

Laravel用ライブラリ

[https://github.com/joblocal/laravel-sqs-sns-subscription-queue:embed:cite]

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

[https://github.com/wand2016/laravel-fanout-sample:embed:cite]

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

    • app_a: publisher / subscriber
    • app_b: subscriber

処理の流れ

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

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

[https://hackernoon.com/pub-sub-with-aws-sns-sqs-and-laravel-ed9f7e1bd79:embed:cite]

Laravel Worker

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