Amazon SQS での停止復旧シナリオ
FIFOキューの重複排除プロセスでは、時間的制約があります。アプリケーションを設計するときは、プロデューサーとコンシューマーの両方が、重複を発生させたり、処理に失敗することなく、クライアントやネットワークの停止から復旧できるようにする必要があります。
プロデューサーに関する考慮事項
-
Amazon SQS は 5 分間の重複排除ウィンドウを適用します。
-
プロデューサーが 5 分後に
SendMessageリクエストを再試行すると、Amazon SQS はそのリクエストを新しいメッセージとして扱い、重複が生じる可能性があります。
コンシューマーの考慮事項
-
可視性タイムアウトが期限切れになる前にコンシューマーがメッセージを処理できなかった場合、別のコンシューマーがメッセージを受信して処理し、処理が重複する可能性があります。
-
アプリケーションの処理時間に基づいて可視性タイムアウトを調整します。
-
ChangeMessageVisibilityAPI を使用して、メッセージの処理中にタイムアウトを延長します。 -
メッセージの処理が繰り返し失敗する場合は、メッセージを無期限に再処理するのではなく、デッドレターキュー (DLQ) にルーティングします。
-
プロデューサーは、キューの重複排除間隔を認識する必要があります。Amazon SQS には 5 分の重複排除間隔があります。重複排除間隔の期限後に
SendMessageリクエストを再試行すると、キューに重複メッセージが作成される場合があります。たとえば、車内からモバイルデバイスで、順番が重要なメッセージを送信するとします。確認を受信する前に車が一定時間モバイル接続を失った場合、モバイル接続が回復した後もう一度リクエストを再試行すると、重複が発生します。 -
コンシューマーには、可視性タイムアウトが切れる前にメッセージを処理できなくなるリスクを最小化する可視性タイムアウトが必要です。
ChangeMessageVisibilityアクションをコールして、メッセージが処理されている間に可視性タイムアウトを延長できます。ただし、可視性タイムアウトの期限が切れると、別のコンシューマーがすぐにメッセージの処理を開始するため、1 つのメッセージが複数回処理されてしまいます。このシナリオを回避するには、デッドレターキューを設定します。