SQSは、拡張性と信頼性を大幅に高めるために、リソースの広範な並列化を行うことを理解しています。小さなキューにも冗長サーバーを使用し、キューに投稿されたメッセージも複数のコピーとして冗長に保存されます。これらは、RabbitMQのように1回限りの配信を妨げる要因です。削除されたメッセージも配信されているのを見たことがあります。
開発者にとっての意味は、メッセージの複数の配信に備える必要があるということです。 Amazonはそれが問題ではないと主張していますが、問題がある場合、開発者はdatabase-transaction-lockやdynamo-db条件付き書き込みなどの同期構造を使用する必要があります。これらは両方ともスケーラビリティを低下させます。
重複配信の問題に照らして、message-invisible-period機能はどのように保持されますか?メッセージが非表示になるとは限りません。開発者が同期のために独自の調整を行う必要がある場合、不可視期間の利点は何ですか。見えないはずのメッセージが再配信されるのを見たことがあります。
ここに私はいくつかの参照を含めます
メッセージの不可視性は、1つだけの配信を保証するという別の問題を解決します。キュー内のアイテムに対する長時間実行操作について考えてみます。操作中にプロセッサがクラップスした場合は、メッセージを削除せずに、メッセージを再表示して別のプロセッサで再度処理する必要があります。
つまり、パターンは...
したがって、重複した配信を受け取るかどうかに関係なく、キュー内のアイテムを確実に処理する必要があります。キューから削除するときに削除し、サーバーが停止すると、そのメッセージが永久に失われる可能性があります。スポットインスタンスを使用して積極的なスケーリングを可能にし、(上記のパターンを使用して)メッセージが失われないことを保証します。
しかし-それは一度だけの配達を保証するものではありません。しかし、私はそれがその問題のために設計されているとは思いません。また、乗り越えられない問題ではないと思います。私たちの場合(そして、なぜこれまで問題に気づかなかったのかがわかります)-結果をS3に書き込んでいます。同じファイルを同じデータで上書きしても大した問題ではありません。もちろん、銀行のa/cに行くデビット取引の場合は、おそらく何らかの相関IDが必要になります...そしてほとんどのシステムにはすでにそれらがあります。したがって、重複する相関値を取得した場合は、例外をスローして先に進みます。
良い質問。私のために何かを強調しました。