Amazon SQS可視性タイムアウト - Amazon Simple Queue Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon SQS可視性タイムアウト

コンシューマーがキューからメッセージを受信して処理しても、そのメッセージはキューに保留されたままです。Amazon SQSでは、メッセージが自動的に削除されません。Amazon SQSは分散システムであり、接続の問題やコンシューマーアプリケーションの問題などが原因で、コンシューマーが実際にメッセージを受信するという保証がありません。そのため、コンシューマーはメッセージを受信して処理した後、キューからメッセージを削除する必要があります。

可視性タイムアウト中のリクエストの処理方法を示すタイムライングラフ

メッセージが受信された直後は、メッセージはキューに保留されたままです。他のコンシューマーがメッセージを再度処理しないように、Amazon SQS は可視性タイムアウト を設定します。これは、Amazon SQS がすべてのコンシューマーがメッセージの受信と処理を禁止している期間です。デフォルトの可視性タイムアウトは30秒です。最小は0秒です。最大は12時間です。コンソールを使用したキューの可視性タイムアウトの設定については、「Amazon SQS コンソールを使用したキューパラメータの設定」を参照してください。

注記

スタンダードキューの場合は、可視性タイムアウトはメッセージを2回受信しない保証にはなりません。詳細については、「Amazon SQS at-least-once 配信」を参照してください。

FIFOキューでは、プロデューサまたはコンシューマが複数の再試行を試みることができます。

  • プロデューサが障害を検出したSendMessageアクションがある場合、同じメッセージ重複除外 IDを使用して、必要な回数だけ送信を再試行できます。重複除外間隔の期限が切れる前にプロデューサが少なくとも1つの確認応答を受信すると仮定すると、複数回の再試行はメッセージの順序に影響せず、重複も発生しません。

  • コンシューマが障害を検出した場合ReceiveMessageアクションの場合、同じ受信リクエスト試行 IDを使用して、必要な回数だけ再試行できます。可視性タイムアウトの期限が切れる前にコンシューマが少なくとも1つの確認応答を受信すると仮定すると、複数回の再試行はメッセージの順序に影響しません。

  • メッセージグループ IDがあるメッセージを受信した場合、メッセージを削除するか、表示されない限り、同じメッセージグループ IDのメッセージはそれ以上返信されません。

インフライトメッセージ

Amazon SQS メッセージには、次の 3 つのベーシックな状態があります。

  1. プロデューサーからキューに送信されます。

  2. コンシューマがキューから受信しました。

  3. キューから削除されました。

メッセージは、次のものと見なされます。保存されたプロデューサからキューに送信され、コンシューマによってキューからまだ受信されていない (つまり、1と2の間の状態)。保存されるメッセージの数にクォータはありません。メッセージは、次のものと見なされます。保留中コンシューマがキューから受信したが、キューから削除されていない(つまり、ステート2と3の間の状態)。フライト中のメッセージの数にはクォータがあります。

重要

インフライトメッセージに適用されるクォータは、保存されているメッセージの数に制限はありません。

ほとんどのスタンダードキューでは (キュートラフィックとメッセージバックログにより異なります)、最大約 120,000 通の処理中のメッセージ (コンシューマーからキューを受信し、キューからまだ削除されていないもの) が存在する可能性があります。ショートポーリングを使用している場合、このクォータに達すると、Amazon SQS はOverLimitエラーメッセージをし返信します。ロングポーリングを使用している場合、 Amazon SQSはエラーメッセージを返しません。クォータに到達しないように、処理されたメッセージはキューから削除する必要があります。メッセージの処理に使用するキューの数を増やすこともできます。クォータの引き上げをリクエストするには、サポートリクエストを送信します

FIFO キューでは、最大 20,000 通 の処理中メッセージ (コンシューマがキューから受信して、キューから削除されていないもの) が存在する可能性があります。このクォータに届いた場合、Amazon SQSはエラーメッセージを返しません。

重要

FIFO キューを使用する場合、可視性タイムアウトウィンドウ外でリクエストが受信されると、DeleteMessageオペレーションは失敗します。可視性タイムアウトが 0 秒の場合、メッセージは送信されたのと同じミリ秒以内に削除する必要があります。そうしないと、中止されたと見なされます。これにより、MaxNumberOfMessagesパラメータが 1 Amazon SQS はReceiveMessageオペレーションへの同じレスポンスに重複メッセージを含める可能性があります。詳細については、Amazon SQSFIFO API の仕組み」を参照してください。

可視性タイムアウトの設定

可視性タイムアウトはAmazon SQSがメッセージを返した時点で開始します。タイムアウト時間内に、コンシューマーはメッセージを処理して削除します。ただし、コンシューマーでメッセージを削除する前に障害が発生して、DeleteMessageアクションが呼び出されないまま可視性タイムアウトの期限が切れると、そのメッセージは他のコンシューマーに見えるようになり、再度受信されます。メッセージを一度だけ受信する必要がある場合、コンシューマーは可視性タイムアウトの時間内にメッセージを削除する必要があります。

すべてのAmazon SQSキューの可視性タイムアウトはデフォルトで 30秒に設定されています。この設定はキュー全体で変更できます。通常、可視性タイムアウトは、アプリケーションがキューのメッセージを処理して削除するまでの最大所要時間に設定します。メッセージを受信したら、キュー全体のタイムアウトを変更しなくても、返されるメッセージに特別な可視性タイムアウトを設定することもできます。詳細については、「Amazon SQS でのメッセージのタイムリーな処理」セクションのベストプラクティスを参照してください。

メッセージの処理に要する時間がわからない場合は、ハートビートコンシューマプロセスの場合:初期可視性タイムアウト (2 分など) を指定し、コンシューマがメッセージで作業している限り、可視性タイムアウトを1分ごとに2分延長します。

重要

最大可視性タイムアウトは、ReceiveMessageAmazon SQS がメッセージを受信してから 12 時間です。可視性タイムアウトを延長しても、最大 12 時間はリセットされません。

さらに、ReceiveMessageリクエストがタイマーを開始してから 12 時間 (43,200 秒など) は、個々のメッセージのタイムアウトを設定できない場合があります。例えば、メッセージを受信し、すぐに 43,200 秒VisibilityTimeoutに等しい のChangeMessageVisibility呼び出しを送信して最大 12 時間を設定すると、失敗する可能性があります。ただし、 経由でメッセージをリクエストReceiveMessageしてから可視性タイムアウトを更新するまでに大幅な遅延がない限り、43,195 秒の値を使用すると機能します。コンシューマーが12時間以上必要とする場合は、ステップ機能 の使用を検討してください。

メッセージの可視性タイムアウトの変更

キューからメッセージを受信し、処理を開始したときに、キューの可視性タイムアウトが十分でない場合があります (たとえば、メッセージを処理して削除する必要がある場合)。ChangeMessageVisibility アクションを使用して新しいタイムアウト値を指定すると、メッセージの可視性を短縮または拡張することができます。

たとえば、キューのデフォルトのタイムアウトが60秒であり、メッセージを受信してから15秒が経過したときに、ChangeMessageVisibilityを10秒に設定したVisibilityTimeoutコールを送信する場合、この10秒はChangeMessageVisibilityコールを行った時点からカウントが開始されます。したがって、最初に可視性タイムアウトを変更してから10秒 (合計25秒) 経過した後に可視性タイムアウトを変更しようとしたり、そのメッセージを削除しようとすると、エラーが発生する可能性があります。

注記

新しいタイムアウト期間は、ChangeMessageVisibilityアクションを呼び出した時間から有効になります。さらに、新しいタイムアウト期間はメッセージの特定の受信にのみ適用されます。ChangeMessageVisibilityは、メッセージの以降の受信や以降のキューには影響しません。

メッセージの可視性タイムアウトの終了

キューからメッセージを受信すると、そのメッセージを実際には処理して削除する必要がないとわかる場合があります。Amazon SQSでは、特定のメッセージの可視性タイムアウトを終了できます。その場合、システムの他のコンポーネントからメッセージがすぐに見えるようになり、処理できるようになります。

ReceiveMessageを呼び出した後にメッセージの可視性タイムアウトを終了するにはChangeMessageVisibility、を呼び出します。VisibilityTimeoutと0秒に設定します。