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

Amazon SQS可視性タイムアウト

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


	            可視性タイムアウト

メッセージが受信された直後は、メッセージはキューに残ったままです。他のコンシューマーが同じメッセージを再処理しないように、Amazon SQS は可視性タイムアウトを設定しています。Amazon SQS では、この時間内に他のコンシューマーが同じメッセージを受信したり処理したりすることはできません。メッセージのデフォルトの可視性タイムアウトは 30 秒です。最小値は 0 秒、最大スケールは 12 時間です。 AWS マネジメントコンソール を使用してキューに可視性タイムアウトを設定する方法、AWS SDK for Java (および SetQueueAttributesGetQueueAttributesReceiveMessageChangeMessageVisibilityChangeMessageVisibilityBatch の各アクション) を使用して単一または複数のメッセージの可視性タイムアウトを設定する方法については、「チュートリアル: Amazon SQS キューに可視性タイムアウトを設定する」を参照してください。

注記

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

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

  • コンシューマーが失敗した SendMessage アクションを検出した場合、同じメッセージ重複排除 ID を使用して必要に応じて何回でも送信を再試行できます。重複排除の期間が終了する前にプロデューサーが少なくとも 1 つの確認を受信した場合、複数の再試行を行ってもメッセージの順序に影響したり、重複が発生したりすることはありません。

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

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

インフライトメッセージ

Amazon SQS メッセージには 3 つの基本的な状態があります。

  1. プロデューサーによってキューへ送信される

  2. コンシューマーによってキューから受信される

  3. キューから削除される。

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

重要

Quotas that apply to inflight messages are unrelated to the unlimited number of stored messages.

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

FIFO キューの場合、キューには最大 20,000 のインフライトメッセージが存在できます (コンシューマーによってキューから受信されたが、まだキューから削除されていない)。このクォータに達しても、Amazon SQS よりエラーメッセージは返りません。

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

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

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

メッセージの処理にかかる時間がわからない場合は、コンシューマープロセスのハートビートを作成します。初期の可視性タイムアウト (たとえば 2 分) を指定し、(コンシューマーがメッセージを処理し続けている限り) 毎分、可視性タイムアウトを 2 分へと延長しなおします。

重要

最大可視性タイムアウトは、Amazon SQS がメッセージを受信してから 12 時間です。可視性タイムアウトを延長しても、12 時間という最大時間はリセットされません。コンシューマーが 12 時間以上必要とする場合は、AWS Step Functions の使用を検討してください。

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

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

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

注記

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

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

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

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