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

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

Amazon SQS可視性タイムアウト

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


	            可視性タイムアウト

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

注記

スタンダードキューの場合は、可視性タイムアウトはメッセージを2回受信しない保証にはなりません。詳細については、「t-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 SQSReceiveMessage はオペレーションに対する同じ応答に重複するメッセージを含める可能性があります。詳細については、「Amazon SQS FIFO API の仕組み」を参照してください。

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

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

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

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

重要

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

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

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

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

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

注記

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

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

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

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