Amazon Simple Queue Service
開発者ガイド

Amazon SQS ショートポーリングとロングポーリング

キューからのメッセージを処理するプロセスは、ショートポーリング使用するか、ロングポーリングを使用するかによって異なります。Amazon SQS はデフォルトでショートポーリングを使用して、サーバーのサブセットだけに対して (重み付けされたランダム分散に基づいて) クエリを実行し、レスポンスに利用できるメッセージがあるかどうかを調べます。

ショートポーリングを使用したメッセージの処理

ショートポーリングを使用してキューからのメッセージを処理する場合、Amazon SQS によりサーバーのサブセットがサンプリングされ (重み付けされたランダム分散に基づいて)、それらのサーバーのメッセージだけが返されます。したがって、ある受信リクエストによってすべてのメッセージが返されないことがあります。ただし、キューにあるメッセージが 1000 未満の場合、後続のリクエストではメッセージが返されます。キューから処理し続けた場合、Amazon SQS によりすべてのサーバーがサンプリングされ、すべてのメッセージを受信します。

次の図は、システムコンポーネントの 1 つが受信リクエストを生成すると スタンダード キューからメッセージが返されるショートポーリングの動作を示しています。Amazon SQS は、複数のサーバー (灰色) をサンプリングし、それらのサーバーからメッセージ A、C、D、および B を返します。メッセージ E はこのリクエストに返されませんが、後続のリクエストには返されます。


                    ショート (標準) ポーリングを使用したメッセージのサンプリング

ロングポーリングを使用したメッセージの消費

ReceiveMessage API アクションの待機時間が 0 より大きい場合は、ロングポーリングが有効です。ロングポーリングは、空のレスポンス (ReceiveMessage リクエストに対して使用できるメッセージがない場合) と、偽の空のレスポンス (メッセージが利用できるがレスポンスに含まれていない場合) の数を削減することで、Amazon SQS の使用コストを削減するために役立ちます。 AWS マネジメントコンソール または AWS SDK for Java (および CreateQueueSetQueueAttributesReceiveMessage の各アクション) を使用して、新しいキューまたは既存キューのロングポーリングを有効にする方法については、Amazon SQS キューにロングポーリングを設定する チュートリアルを参照してください。ベストプラクティスについては、ロングポーリングのセットアップ を参照してください。

ロングポーリングには次の利点があります。

  • レスポンスの送信前にメッセージがキューで使用可能になるまで Amazon SQS が待機できるように、空のレスポンス数を削減します。接続がタイムアウトしない限り、ReceiveMessage リクエストに対するレスポンスに、使用可能なメッセージが少なくとも 1 つ、最大で ReceiveMessage アクションに指定されたメッセージ数まで含まれます。

  • —(サブセットではなく) すべての —Amazon SQS サーバーにクエリを実行して、偽の空のレスポンスを排除します。

    注記

    ロングポーリングを実行して、ApproximateNumberOfMessagesDelayedApproximateNumberOfMessagesNotVisible、および ApproximateNumberOfMessagesVisible メトリクスが、プロデューサーがメッセージ送信を停止した少なくとも 1 分後 (キューのメタデータが結果整合性に達するとき) に 0 と等しい場合、キューが空であることを確認できます。詳細については、「使用可能な Amazon SQS の CloudWatch メトリクス」を参照してください。

  • 利用可能になるとすぐにメッセージを返します。

ロングポーリングとショートポーリングの違い

ショートポーリングは、WaitTimeSeconds リクエストの ReceiveMessage パラメータを次の 2 通りの方法で 0 に設定すると行われます。

  • ReceiveMessageコールは WaitTimeSeconds0 に設定します。

  • ReceiveMessage コールでは WaitTimeSeconds を設定しませんが、キューの属性 ReceiveMessageWaitTimeSeconds0 に設定されます。