1. ホーム
  2. amazon-web-services

[解決済み] Amazon SQSを複数のコンシューマで使用する

2022-01-31 22:08:25

質問

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

  • 登録サービス :
    • 新しいユーザーが登録されると、イベント 'registration-new' を発行します。
  • ユーザーサービス :
    • ユーザーが更新されたときにイベント 'user-updated' を発行します。
  • 検索サービス :
    • キュー 'registration-new' から読み込んで、ユーザを検索対象にインデックスします。
    • キュー 'user-updated' から読み込み、検索対象のユーザーを更新します。
  • メトリックスサービス :
    • registration-new'キューから読み込み、Mixpanelに送信します。
    • キュー 'user-updated' から読み込み、Mixpanel に送信します。

いろいろと問題があるのですが。

  • ポーリングを行う際、メッセージを複数回受信することがある。多くのシステムはべき乗になるように設計できますが、いくつかのサービス(例えばメトリクスサービス)については、それははるかに難しいでしょう。
  • SQSのキューからメッセージを手動で削除する必要があります。私は、すべてのサービスがメッセージを受信したときに、メッセージの削除を処理するquot;message-handling-service"を実装することを考えました(各サービスは、メッセージを処理した後に「メッセージ承認」イベントを発行することになります)。

SQSの1つのキューに対して複数のコンシューマを持つことができ、かつメッセージの配信と削除を確実に行うには、どのようなパターンを使用すればよいのでしょうか。ご助力ありがとうございます。

解決方法を教えてください。

やり方が間違っているのでは?

同じキューを複数の異なることに使っているように見えます。1つのキューを1つの目的に使う方がよいでしょう。

イベントを 'registration-new' キューに入れ、2つの異なるサービスがそのキューをポーリングし、両方がそのメッセージを読む必要があり、両方で異なることをする(そして、他の2つがそれを処理した後にそのメッセージを削除することになっている第3のプロセスが必要)のではなく、です。

1つのキューは、1つの目的のために使用されるべきです。

  • index-user-search」キューと「send to mixpanels」キューを作成します。 検索サービスは、検索キューから読み込んで、ユーザーをインデックス化します。 というメッセージが表示され、すぐに削除されます。

  • mixpanel-serviceは、mix-panelsのキューから読み込み、そのキューにある
    メッセージを削除します。

登録サービスは、1つのキューに 'registration-new' を発行する代わりに、2つのキューに発行するようになりました。

さらに一歩進んで、ここにSNSを追加して、登録サービスが「registration-new」トピック(キューではない)にSNSメッセージを発信し、そのトピックに、上で述べた両方のキューを「ファンアウト」パターンでサブスクライブするようにします。

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

将来、第3の無関係なサービスも 'registration-new' イベントを処理する必要がある場合、別のキューを作成し、それを同様にトピックに登録します - それは、依存関係や他のサービスが何をしているかについての知識なしで実行できます - それが目標です。