web-dev-qa-db-ja.com

複数のコンシューマーでAmazon SQSを使用する

複数のキューと複数のコンシューマーでAmazon SQSを使用するサービスベースのアプリケーションがあります。イベントベースのアーキテクチャを実装し、他のシステムの状態の変化に異なるサービスが反応するすべてのサービスを分離できるように、これを行っています。例えば:

  • 登録サービス
    • 新しいユーザーが登録されると、イベント 'registration-new'が発生します。
  • ユーザーサービス
    • ユーザーが更新されると、イベント「user-updated」が発生します。
  • 検索サービス
    • キュー「registration-new」から読み取り、検索中のユーザーにインデックスを付けます。
    • キュー「user-updated」から読み取り、検索中のユーザーを更新します。
  • メトリックサービス
    • 「新規登録」キューから読み取り、Mixpanelに送信します。
    • キュー「user-updated」から読み取り、Mixpanelに送信します。

私はいくつかの問題を抱えています:

  • ポーリングを行うと、メッセージを複数回受信できます。多くのシステムをべき等になるように設計することはできますが、一部のサービス(メトリックサービスなど)でははるかに困難になります。
  • メッセージは、SQSのキューから手動で削除する必要があります。すべてのサービスがメッセージを受信したときにメッセージの削除を処理する「メッセージ処理サービス」を実装することを考えました(各サービスはメッセージの処理後に「メッセージ確認済み」イベントを発行します)。

私の質問はこれだと思います:メッセージが確実に配信および削除されることを保証しながら、SQSの単一キューに対して複数のコンシューマーを確保できるようにするために、どのパターンを使用する必要があります。ご協力ありがとうございました。

24
user2205763

間違っていると思います。

同じキューを使用して複数の異なることをしているように見えます。単一の目的で単一のキューを使用する方が適切です。

イベントを「新規登録」キューに入れてから、2つの異なるサービスがそのキューをポーリングする代わりに、両方がそのメッセージを読み取り、両方ともそれとは異なる何かをする必要があります(そして、それを削除することになっている3番目のプロセスが必要です)他の2人が処理した後のメッセージ)。

1つの目的で1つのキューを使用する必要があります。

  • 「index-user-search」キューと「mixpanelsに送信」キューを作成して、検索サービスが検索キューから読み取り、ユーザーのインデックスを作成し、すぐにメッセージを削除するようにします。

  • Mixpanel-serviceは、mix-panelsキューから読み取り、処理します
    メッセージおよびメッセージを削除します。

登録サービスは、「registration-new」を単一のキューに発行する代わりに、2つのキューに発行します。

一歩前進させるには、ここにミックスにSNSを追加し、登録サービスに「registration-new」トピック(キューではなく)にSNSメッセージを送信させてから、上記の両方のキューをそのトピックにサブスクライブさせます「ファンアウト」パターン。

https://aws.Amazon.com/blogs/aws/queues-and-notifications-now-best-friends/

両方のキューがメッセージを受信しますが、SNSにロードするのは1回だけです-3番目の無関係なサービスが「登録新規」イベントも処理する必要がある場合、別のキューを作成してトピックにサブスクライブすることもできます-依存関係や他のサービスが何をしているかを知らずに実行する-それが目標です。

39
E.J. Brennan