複数のキューと複数のコンシューマーで Amazon SQS を使用するサービスベースのアプリケーションがあります。これを行っているのは、イベント ベースのアーキテクチャを実装し、すべてのサービスを切り離して、さまざまなサービスが他のシステムの状態の変化に反応できるようにするためです。例えば:
- 登録サービス:
- 新しいユーザーが登録すると、イベント 'registration-new' が発行されます。
- ユーザー サービス:
- ユーザーが更新されると、'user-updated' イベントを発行します。
- 検索サービス:
- キュー 'registration-new' から読み取り、検索でユーザーにインデックスを付けます。
- キュー「user-updated」から読み取り、検索中のユーザーを更新します。
- メトリクス サービス:
- 'registration-new' キューから読み取り、Mixpanel に送信します。
- 'user-updated' キューから読み取り、Mixpanel に送信します。
私はいくつかの問題を抱えています:
- ポーリングを行うと、メッセージを複数回受信できます。多くのシステムを冪等になるように設計できますが、一部のサービス (メトリクス サービスなど) ではそれがはるかに難しくなります。
- SQS のキューからメッセージを手動で削除する必要があります。すべてのサービスがメッセージを受信したときにメッセージの削除を処理する「メッセージ処理サービス」を実装することを考えました (各サービスは、メッセージを処理した後に「メッセージ確認」イベントを発行します)。
私の質問は次のとおりだと思います。メッセージが確実に配信および削除されるようにしながら、SQS の単一のキューに対して複数のコンシューマーを確保するには、どのパターンを使用すればよいでしょうか。ご協力ありがとうございました。