web-dev-qa-db-ja.com

AmazonSQSメッセージの複数配信

SQSは、拡張性と信頼性を大幅に高めるために、リソースの広範な並列化を行うことを理解しています。小さなキューにも冗長サーバーを使用し、キューに投稿されたメッセージも複数のコピーとして冗長に保存されます。これらは、RabbitMQのように1回限りの配信を妨げる要因です。削除されたメッセージも配信されているのを見たことがあります。

開発者にとっての意味は、メッセージの複数の配信に備える必要があるということです。 Amazonはそれが問題ではないと主張していますが、問題がある場合、開発者はdatabase-transaction-lockやdynamo-db条件付き書き込みなどの同期構造を使用する必要があります。これらは両方ともスケーラビリティを低下させます。

質問は、

重複配信の問題に照らして、message-invisible-period機能はどのように保持されますか?メッセージが非表示になるとは限りません。開発者が同期のために独自の調整を行う必要がある場合、不可視期間の利点は何ですか。見えないはずのメッセージが再配信されるのを見たことがあります。

編集

ここに私はいくつかの参照を含めます

  1. Amazon SQSで「1回限りの配信」動作を実現するためのグッドプラクティスは何ですか?
  2. http://aws.Amazon.com/sqs/faqs/#How_many_times_will_I_receive_each_message
  3. http://aws.Amazon.com/sqs/faqs/#How_does_Amazon_SQS_allow_multiple_readers_to_access_the_same_message_queue_without_losing_messages_or_processing_them_many_times
  4. http://aws.Amazon.com/sqs/faqs/#Can_a_deleted_message_be_received_again
27
inquisitive

メッセージの不可視性は、1つだけの配信を保証するという別の問題を解決します。キュー内のアイテムに対する長時間実行操作について考えてみます。操作中にプロセッサがクラップスした場合は、メッセージを削除せずに、メッセージを再表示して別のプロセッサで再度処理する必要があります。

つまり、パターンは...

  1. アイテムをキューに書き込む(プッシュする)
  2. キュー内のアイテムを表示(ピーク)
  3. アイテムを非表示にする
  4. アイテムに対してプロセスを実行します
  5. 結果を書く
  6. キューからアイテムを削除(ポップ)します

したがって、重複した配信を受け取るかどうかに関係なく、キュー内のアイテムを確実に処理する必要があります。キューから削除するときに削除し、サーバーが停止すると、そのメッセージが永久に失われる可能性があります。スポットインスタンスを使用して積極的なスケーリングを可能にし、(上記のパターンを使用して)メッセージが失われないことを保証します。

しかし-それは一度だけの配達を保証するものではありません。しかし、私はそれがその問題のために設計されているとは思いません。また、乗り越えられない問題ではないと思います。私たちの場合(そして、なぜこれまで問題に気づかなかったのかがわかります)-結果をS3に書き込んでいます。同じファイルを同じデータで上書きしても大した問題ではありません。もちろん、銀行のa/cに行くデビット取引の場合は、おそらく何らかの相関IDが必要になります...そしてほとんどのシステムにはすでにそれらがあります。したがって、重複する相関値を取得した場合は、例外をスローして先に進みます。

良い質問。私のために何かを強調しました。

16
Pete