すべてのプロダクト
Search
ドキュメントセンター

:LongPolling

最終更新日:Mar 22, 2020

LongPolling

状況

Message Service は、LongPolling モードでのメッセージの受信が可能です。つまり、メッセージを受信した場合の WaitSecond を 1〜30 に設定します。LongPolling により、サーバーはクライアントから送信されたリクエストを保持し、クライアントに対するメッセージが存在する場合のみレスポンスを返します。このため、初回の受信メッセージが保証されるほか、クライアントから大量の無効なリクエストを受信するのを防ぎます。Message Service では、LongPolling が推奨されます。

LongPolling では、サーバーが HTTP レイヤーで永続的接続を保持する必要があります。ただし、サーバーでは、HTTP レイヤーでの永続的接続のリソースは限られています。悪意のある攻撃を防ぐため、Message Service では 1 人のユーザーの LongPolling 接続数は制限されています。

問題の説明

一部のユーザーは、メッセージを取得するために、1 つのクライアント内の数百のスレッドから Message Service サーバーに同時にアクセスできます。キュー内にメッセージがない場合、クライアントには数百もの LongPolling モードのリクエストがあります。ユーザーが複数のクライアントを使用している場合、何千もの LongPolling リクエストを同時に送信する必要があります。

このシナリオでは、ユーザーが LongPolling リクエストを送信すると、Message Service サーバーはリクエストを保持するのではなく、「メッセージは存在しません」というエラーを返すことがあります。

ユーザーは、予想した LongPolling の結果を取得できません。一部のユーザーは、例外処理を行わずに While ループで LongPolling リクエストを送信し続けます。しばらくして、大量のリクエストが送信されたことに気付きます。

解決策

キューにメッセージがない場合、サーバーに同時にアクセスする数百ものスレッドに LongPolling をアタッチする必要はありません。1〜N のスレッドにのみ LongPolling をアタッチします。LongPolling をアタッチしているスレッドがキュー内でメッセージを見つけると、他のスレッドを起動してメッセージを受信し、高速なレスポンスを実現できます。

LongPolling サンプルコードは、MessageReceiver を使用してメッセージを受信する場合のベストプラクティスです。MessageReceiver インスタンスは、メッセージを受信するすべてのスレッドに対して作成され、receiver.receiveMessage はメッセージの受信に使用されます。

receiver には、LongPolling 用の排他メカニズムがあります。あるスレッドが LongPolling を実行している場合、他のスレッドはメッセージを待機できます。