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

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

Amazon SQS可視性タイムアウト

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


	            可視性タイムアウト

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

注記

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

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 秒の場合、メッセージは送信されたのと同じミリ秒以内に削除する必要があります。削除しないと、破棄されたと見なされます。これにより、Amazon SQS がReceiveMessageオペレーションがMaxNumberOfMessagesパラメータが 1 より大きい。詳細については、「」を参照してください。Amazon SQS FIFO API の仕組み

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

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

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

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

重要

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

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

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

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

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

注記

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

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

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

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