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 分延長します。

重要

最大可視性タイムアウトは Amazon SQS がReceiveMessageリクエスト. 可視性タイムアウトを延長しても、12 時間という最大時間はリセットされません。

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

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

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

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

注記

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

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

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

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