web-dev-qa-db-ja.com

メッセージを1回だけ配信するSQS

同じsqから100個のスレッドを読み取っているとしましょう-各メッセージが最大で1回配信されることが保証されていますか?同じメッセージを複数回配信することは可能ですか?この問題に関する明確なドキュメントが見つかりません。 s

15
Vladimir

2016年11月17日更新:FIFOキューイングと配信1回限り 本日リリースされました(この回答からほぼ2年後当初の投稿)およびSQSは、1回限りの配信をサポートするようになりました。詳細は次のとおりです。

  • FIFOキュー を作成する必要があります。
  • 重複排除は、キューメッセージの属性としてMessageDeduplicationIdをチェックし、MessageDeduplicationIdをチェックすることにより、いずれかのアクションに続く5分間の重複排除間隔で重複メッセージが送受信されるのを防ぎます。
  • コンテンツベースの重複排除がFIFOキューで明示的に有効になっている場合、MessageDeduplicationIdはメッセージ本文のSHA-256ハッシュを使用して自動的に生成されます(コンテンツのみ、属性ではありません)。
  • コンテンツベースの重複排除が有効になっていない場合は、送信時にMessageDeduplicationIdに独自の任意の値を明示的に設定する必要があります。そうしないと、SendMessageはエラーで失敗します。

コンテンツベースの重複排除は、 キューの作成 または キューの属性の更新 の場合に有効にできます。

SendMessage および ReceiveMessage ドキュメントのMessageDeduplicationIdの詳細。


2016年11月17日以降、これは標準(FIFOではない)キューに引き続き適用されます:

SQSの標準(FIFOではない)キューの分散性により、保証は代わりに「少なくとも1回」です。

[〜#〜] faq [〜#〜] から:

Q:各メッセージは何回受信されますか?

Amazon SQSは、キュー内のすべてのメッセージを「少なくとも1回」配信するように設計されています。ほとんどの場合、各メッセージは1回だけアプリケーションに配信されますが、メッセージを複数回処理してもエラーや不整合が発生しないようにシステムを設計する必要があります。

少なくとも1回 配信に関する詳細情報:

Amazon SQSは、冗長性と高可用性のために、メッセージのコピーを複数のサーバーに保存します。まれに、メッセージを受信または削除したときに、メッセージのコピーを保存しているサーバーの1つが使用できない場合があります。その場合、その使用できないサーバーでメッセージのコピーが削除されることはなく、メッセージを受信したときにそのメッセージのコピーを再度取得する可能性があります。このため、アプリケーションをべき等になるように設計する必要があります(つまり、同じメッセージを複数回処理しても悪影響を受けないようにする必要があります)。

アプリケーションで「最大で1回」の処理を保証する必要がある場合は、アプリケーションで SQSメッセージの一意の識別子 をチェックし、以前に処理した、または現在処理しているメッセージIDを処理しないようにすることができます。処理。

27
Anthony Neace

FIFOキューを使用する必要がありますが、メッセージの重複がないことを保証する番号を生成する必要があります。送信する前に、リクエストで生成された番号でMessageDeduplicationIdを設定できます。それをSQSに。

より簡単に、FIFOキューのContent-Based-Deduplicationをオンにし、送信されたメッセージのコンテンツに基づいてハッシュを作成して重複排除を回避することで、AWS自体に複製を管理させることができます。

  • コンソールからSQSサービスに移動し、キューを選択し、ActionsからConfigure queueを選択します

enter image description here

  • Content-Based Deduplicationをオンにします

enter image description here

0