45

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

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

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

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

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

4

3 に答える 3

70

私はあなたが間違っていると思います。

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

イベントを 'registration-new' キューに入れてから、2 つの異なるサービスがそのキューをポーリングし、両方がそのメッセージを読み取り、両方がそれに対して何か異なることを行う必要がある (そして、それを削除することになっている 3 番目のプロセスが必要になる) 代わりに他の 2 人が処理した後のメッセージ)。

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

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

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

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

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

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

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

于 2015-05-18T08:25:48.720 に答える