ロングポーリングとは何か？
Published: 2023-12-12 10:55:40

ロングポーリングとは？
-----------

ロング・ポーリングは、クライアントとウェブ・サーバー間のほぼ瞬時の通信を実現するために、リアルタイムのウェブ・アプリケーションで使用されます。特に、リアルタイムの更新が重要なチャットやメッセージング・アプリケーションで有用です。

従来の[HTTP](https://www.pubnub.com/guides/http/)通信では、クライアントはサーバーに新しいリクエストを送信し、応答を待ちます。これはショート・ポーリングとして知られている。しかし、リアルタイムのシナリオでは、ショート・ポーリングはサーバーへの頻繁なリクエストを必要とし、不必要なネットワーク・オーバーヘッドと待ち時間の増加をもたらすため、効率的でない場合がある。

一方、ロング・ポーリングは、新しいデータが利用可能になるまで、リク エストを長時間オープンにしておくことで、効率を向上させる。サーバーはリクエストをオープンしたまま、クライアントに送り返す新しい情報が得られるまで待ちます。サーバは新しいデータを得るとクライアントに応答し、クライアントはそのデータを処理して新しいロングポーリング要求を開始することができる。

クライアントとサーバー間の接続を長期にわたって維持することで、ロングポーリングはリクエストの回数を減らし、待ち時間を最小限に抑え、リアルタイム通信を向上させます。このため、スケーラブルで応答性の高いチャットやメッセージング・アプリケーションを構築するための効果的なテクニックを必要とするユースケースや、ゲームのようなリアルタイムデータを利用するその他のアプリケーションに最適です。

ロングポーリングの仕組み
------------

ロングポーリングは、クライアントとサーバー間でほぼ瞬時にメッセージを配信するためにリアルタイム通信で使用されるテクニックです。低レイテンシーとリアルタイム更新が重要なチャットやメッセージング・アプリケーションを構築する際に特に有用です。

伝統的に、ウェブブラウザはサーバからデータを取得するためにプルベースのアプローチを使用しています。クライアントはサーバーにリクエストを送り、サーバーはリクエストされたデータを返します。ショート・ポーリングとして知られるこのアプローチは、クライアントが更新をチェックするために何度もリクエストを送信しなければならないため、通信に遅延が生じる可能性があります。

一方、ロング・ポーリングはプッシュ・ベースのアプローチで、サーバーは更新があるとすぐにクライアントに送信することができる。仕組みはこうだ：

1.  クライアントは、通常HTTPリクエストによってサーバーへのリクエストを開始する。
    
2.  クライアントはサーバーへのリクエストを開始し、通常はHTTPリクエストで応答します。サーバーは即座に応答する代わりに、リクエストをオープンにしてコネクションをアクティブに保ちます。
    
3.  新しいデータがない場合、サーバーは送り返すものがあるまで待ちます。
    
4.  サーバーが新しいデータを取得するか、あらかじめ定義されたタイムアウトが発生すると、最新の情報をクライアントに応答します。
    
5.  応答を受け取ると、クライアントは直ちにサーバーに再度リクエストを送り、接続を維持する。
    
6.  このリクエストの送信とレスポンスの受信のサイクルを繰り返すことで、リアルタイムの更新が保証される。
    

ロングポーリングは、リクエストとレスポンスのサイクルを長時間にわたって維持することで、クライアントとサーバー間のリアルタイム接続を効果的にシミュレートします。これにより、サーバーはアップデートが利用可能になるとすぐにクライアントにプッシュすることができ、クライアントがアップデートを何度もチェックする必要がなくなります。

ロング・ポーリングの実装にはどのような技術が使われていますか？
-------------------------------

ロングポーリングは、クライアントとサーバー間のリアルタイム通信を実現する技術です。インスタントアップデートが重要なチャットやメッセージングアプリケーションでよく使用されます。ロングポーリングの実装にはいくつかの技術があり、それぞれに利点と注意点があります。ここでは、ロングポーリングを実装する際によく使われる技術をいくつか紹介します。

[**HTTPロングポーリング**](https://www.pubnub.com/blog/http-long-polling/)**：**

これはロングポーリングを実装するための最も基本的で広く使われている方法です。HTTPプロトコルを活用し、クライアントとサーバ間で長時間の接続を確立・維持します。クライアントはサーバにリクエストを送信し、サーバは新しいデータが利用可能になるか、一定のタイムアウトに達するまでリクエストをオープンしたままにします。新しいデータが利用可能になると、サーバーは更新された情報で応答し、クライアントは直ちに別のリクエストを送信してこのサイクルを継続する。この方法は実装が簡単で、サーバー側の特別な技術を必要としない。

[**WebSocket：**](https://www.pubnub.com/guides/what-are-websockets-and-when-should-you-use-them/)

WebSocketは全二重通信プロトコルであり、単一の長寿命接続を介してクライアントとサーバー間のリアルタイム通信を可能にします。長時間のポーリングに代わる、より効率的で低レイテンシーの通信手段を提供します。WebSocketは双方向のデータフローを可能にし、クライアントとサーバーが非同期にメッセージを送信できるようにします。これにより、頻繁なHTTPリクエストが不要になり、ネットワークのオーバーヘッドが削減されます。WebSocketは、即時更新とリアルタイムのインタラクションを必要とするアプリケーションに適しています。

[**サーバー送信イベント（SSE）：**](https://www.pubnub.com/guides/server-sent-events/)

SSEは一方向通信技術で、サーバーが単一の長寿命HTTP接続を介してクライアントにデータをプッシュすることができます。SSEを使用すると、クライアントに継続的なリクエストを要求することなく、サーバーからクライアントに複数の更新情報を送信できます。サーバーは接続を開始し、一連のイベントとしてデータを送信する。クライアントはこれらのイベントを受信し、必要に応じて処理することができます。

アプリケーションにロング・ポーリングを実装する技術を選択する際には、考慮すべきいくつかの要素があります：

-   スケーラビリティ：スケーラビリティ：選択した技術が多数の同時接続を処理でき、ユーザー数の増加に応じて拡張できることを確認する。一般的に、WebSocket と SSE は HTTP ベースのロングポーリングよりもスケーラビリティが高く、サーバーリソースをより効率的に使用することができます。
    
-   セキュリティ：選択した技術のセキュリティへの影響を考慮する。WebSocketとSSEは [SSL/TLSの](https://www.pubnub.com/guides/ssl-tls/)ような暗号化プロトコルを使用してセキュリティを確保することができ、データのプライバシーと完全性を保証します。HTTPベースのロング・ポーリングもセキュリティ保護が可能ですが、認証やアクセス制御の対策が必要になる場合があります。
    
-   ブラウザのサポート：選択した技術のブラウザ互換性をチェックする。WebSocketとSSEは、HTTPベースのロングポーリングよりもブラウザのサポートが優れていますが、古いブラウザでは追加の技術やフォールバックオプションが必要になる場合があります。
    
-   実装の複雑さ：選択した技術の実装と保守の容易さを評価する。HTTPベースのロングポーリングは比較的簡単ですが、WebSocketとSSEはより高度な知識とインフラストラクチャを必要とするかもしれません。開発チームの専門知識レベルや、選択した技術の実装と保守に必要なリソースを考慮してください。
    

**ロングポーリングとWebSocketの比較**
-------------------------

[ロングポーリングとWebSocketは](https://www.pubnub.com/blog/long-polling-vs-websockets/)、クライアント（Webブラウザなど）とサーバー間のリアルタイム接続を実現する技術です。似たような目的を果たすが、この2つには大きな違いがある。

ロングポーリングは、クライアントがウェブサーバーにリクエストを行い、サーバーが新しいデータを送り返すまでコネクションをオープンにしておく技術です。サーバーは、新しいデータがあれば即座に応答するか、指定されたタイムアウト時間を待ってから空の応答を送信します。どちらの場合でも、クライアントは応答を受信すると、直ちにサーバーに再リクエストを行い、新しいコネクションを確立する。このプロセスは継続的に繰り返され、サーバーは更新が利用可能になるとすぐにクライアントにプッシュすることができます。

一方、WebSocketはクライアントとサーバー間に持続的な双方向通信チャネルを提供する。リクエストごとに新しい接続が確立されるロング・ポーリングとは異なり、WebSocket接続は一度確立されると無期限にオープンされ続けます。これにより、双方向でリアルタイムかつ低遅延の通信が可能になります。サーバーはいつでもクライアントにデータをプッシュでき、クライアントも応答を待たずにサーバーにデータを送信できます。

### ロング・ポーリングとWebソケットの類似点

1.リアルタイムの更新：ロング・ポーリングとWebソケットは、サーバーとクライアント間のリアルタイム通信を可能にし、継続的なポーリングやリフレッシュを行うことなく、即時更新を可能にする。

2.サーバー負荷の軽減：どちらの手法も、データが利用可能なときにのみデータを送信することで、不要なリクエストを最小限に抑え、サーバーの負荷を軽減し、スケーラビリティを向上させます。

3.幅広い言語とフレームワークのサポート：多くの[一般的なプログラミング言語と](https://www.pubnub.com/docs/sdks)フレームワークがロングポーリングとWebSocketをサポートしているため、さまざまなエコシステムの開発者がアクセス可能です。

### ロングポーリングとWebソケットの違い

1.[待ち時間](https://www.pubnub.com/guides/whats-so-important-about-low-latency/)：ロング・ポーリングでは、サーバーがレスポンスを送信してからクライアントがそれを受信するまでに遅延が発生するため、待ち時間が発生する。Webソケットは双方向の低遅延通信を提供し、より高速なリアルタイム機能を実現します。

2.リソースの消費：長いポーリングは、サーバーが各クライアントとのオープンな接続を維持する必要があり、潜在的にリソースの消費を引き起こし、同時接続数を制限します。しかし、WebSocketは持続的な接続を使用するため、全体的なリソース消費を抑えることができます。

3.スケーラビリティ：長いポーリングでは、コネクションを長時間オープンにしておく必要があるため、サーバーの水平スケーリングが困難になる可能性があります。持続的な接続を持つWebソケットは、多くのオープン接続を必要としないため、スケーラビリティが向上します。

ロング・ポーリングとWebソケットは、どちらもリアルタイムの更新を提供し、サーバーの負荷を軽減しますが、待ち時間、リソース消費、スケーラビリティが異なります。Webソケットは、リソースの消費を抑えながら高速な双方向通信を実現するため、低レイテンシと高いスケーラビリティを必要とするアプリケーションに適しています。一方、低レイテンシーが重要でなく、同時接続数が比較的少ない場合は、ロングポーリングが良い選択肢となります。開発者は、[リアルタイムチャットやメッセージングアプリケーションで](https://www.pubnub.com/guides/real-time-messaging-benefits-basics-and-first-steps/)2つの手法のどちらかを選択する際に、これらの要因を考慮する必要があります。

**ロングポーリングとサーバー送信イベント（SSE）の比較**
-------------------------------

[SSEは](https://www.pubnub.com/blog/websockets-alternatives/)、シンプルで実装が簡単という点ではロングポーリングと似ていますが、サーバからクライアントへの通信を実現する、より効率的で標準化された方法を提供します。この2つの技術の類似点と相違点を見てみましょう。

### ロング・ポーリングとSSEの類似点

1.  リアルタイム更新：ロング・ポーリングとSSEはどちらもサーバーとクライアント間のリアルタイム通信を可能にし、継続的なポーリングやリフレッシュを行うことなく即時更新を可能にします。
    
2.  サーバー負荷の軽減：どちらの手法も、データが利用可能な場合にのみデータを送信することで、不要なリクエストを最小限に抑え、サーバーの負荷を軽減し、スケーラビリティを向上させます。
    
3.  幅広い言語とフレームワークのサポート：多くの一般的なプログラミング言語とフレームワークがロング・ポーリングとSSEをサポートしているため、さまざまなエコシステムの開発者がアクセスできます。
    

### ロングポーリングとSSEの違い

1.  待ち時間：ロング・ポーリングでは、サーバーがレスポンスを送信してからクライアントがそれを受信するまでに遅延が発生するため、待ち時間が発生する。一方、SSEはサーバーからクライアントへの連続的なデータストリームを提供するため、待ち時間が短縮され、リアルタイム性が向上する。
    
2.  リソースの消費：ロング・ポーリングでは、サーバーが各クライアントとのオープンな接続を維持する必要があるため、リソースを消費し、同時接続数が制限される可能性があります。しかし、SSEは単一の長寿命コネクションを使用するため、全体的なリソースの消費を抑えることができます。
    
3.  スケーラビリティ：ロング・ポーリングでは、コネクションを長時間オープンにしておく必要があるため、サーバーの水平スケーリングが困難になる可能性があります。SSEでは、クライアントごとに1つのコネクションを使用するため、多くのコネクションをオープンにしておく必要がなく、スケーラビリティが向上します。
    

ロング・ポーリングはどのように最適化できますか？
------------------------

ロング・ポーリングはリアルタイム・チャットやメッセージング・アプリケーションで、クライアントの更新をほぼ瞬時に行うために使用されます。しかし、適切に最適化されなければ、リソースを大量に消費し、スケーラビリティの問題を引き起こす可能性があります。ここでは、パフォーマンスとスケーラビリティを向上させるためにロングポーリングを最適化するために使用できるいくつかのテクニックを紹介します。

**バッチ応答：**リクエストごとにレスポンスを送信するのではなく、[複数のアップデートをまとめて](https://developers.google.com/classroom/best-practices/batch#:~:text=separate%20HTTP%20request.-,Response%20to%20a%20batch%20request,same%20order%20as%20the%20requests.)1つのレスポンスとして送信する。これによりHTTPリクエストの数が減り、オーバーヘッドを最小限に抑えることができる。

**圧縮：**ネットワーク経由で送信する前にデータを圧縮することで、ペイロードサイズを大幅に削減でき、その結果、送信が高速化し、帯域幅の消費量が少なくなります。これを実現するには、[Gzip圧縮などの](https://en.wikipedia.org/wiki/Gzip)テクニックを使用できます。

**キャッシュ：** [キャッシュレイヤーを](https://aws.amazon.com/caching/)実装することで、データベースやその他のデータソースの負荷を軽減することができます。頻繁にリクエストされるデータをキャッシュすることで、後続のリクエストはキャッシュ自体から提供され、レスポンスタイムを短縮し、スケーラビリティを向上させることができる。

**接続プール：**リクエストごとに新しいコネクションを作成する代わりに、再利用可能なコネクションのプールを維持することで、ロングポーリング機構の効率を向上させることができます。これにより、リクエストごとに新しいコネクションを確立するオーバーヘッドがなくなり、パフォーマンスが向上します。

**スロットリングとレート制限：**スロットリングとレート制限の仕組みを実装することで、過剰なリクエストがサーバーを圧迫するのを防ぐことができます。これにより、公平なリソース割り当てが保証され、不正使用が防止されるため、パフォーマンスとスケーラビリティが向上します。

[**ロードバランシング**](https://www.pubnub.com/guides/load-balancing/)**：**ロードバランシング技術を使用して、受信リクエストを複数のサーバーに分散すると、負荷が分散され、1つのサーバーが圧倒されるのを防ぐことができます。これにより、ロングポーリングシステム全体のパフォーマンスとスケーラビリティが向上します。

**モニタリングと最適化：** ロングポーリング・システムのパフォーマンスを定期的に監視し、ボトルネックや改善すべき点を特定することで、より良いパフォーマンスとスケーラビリティのためにシステムを最適化することができます。プロファイリング、負荷テスト、パフォーマンス・チューニングなどのテクニックを使用して、パフォーマンスの問題を特定し、対処することができます。

**非同期（Async）処理：** 時間のかかるタスクを[非同期プロセスや](https://www.pubnub.com/blog/asynchronous-tcp-publishing-on-a-single-tcp-payload/)バックグラウンドワーカーにオフロードすることで、リソースを解放し、ロングポーリングシステムの応答性を向上させることができます。これはメッセージキュー、ワーカープロセス、分散コンピューティングによって実現できます。

**接続タイムアウト：** 適切な接続タイムアウトを実装することで、アイドル状態の接続が不要なリソースを消費するのを防ぐことができます。アイドル状態のコネクションを一定時間経過後に閉じることで、システムは他のクライアントのためにリソースを解放し、スケーラビリティを向上させることができます。

**スケーラブルなインフラ：**基礎となるインフラがスケーラブルで、予想される負荷に対応できることを確認することは、ロング・ポーリングを最適化する上で極めて重要です。これには、クラウド・コンピューティング、オートスケーリング、[コンテナ化などの](https://www.pubnub.com/guides/containerization/)技術を利用して、需要に応じて動的にリソースを割り当てることが考えられます。

ロングポーリングと互換性のあるプログラミング言語は？
--------------------------

いくつかのプログラミング言語は、リアルタイムチャットやメッセージングアプリケーションにロングポーリングを実装することができます。以下はその例です：

1.  JavaScript：ロングポーリングは一般的に[JavaScriptと](https://www.pubnub.com/blog/the-comprehensive-pubnub-publish-subscribe-javascript-api-tutorial/)組み合わされ、シームレスなクライアントサイドの実装を可能にします。[React](https://www.pubnub.com/blog/building-a-chat-app-with-react-native-and-pubnub-part-one-messaging/)、Angular、[Vue.jsの](https://www.pubnub.com/blog/building-a-laravel-chat-app-with-php-vue-js-and-pubnub/) ような[JavaScript](https://www.pubnub.com/guides/javascript/)フレームワークは、アプリケーションへのロングポーリングの実装を簡単にするライブラリやツールを提供しています。
    
2.  PHP：[PHPは](https://www.pubnub.com/docs/sdks/php)、ウェブ開発でよく使われる人気のサーバーサイド言語です。PHPは、開発者がロングポーリングを効率的に実装できる機能やライブラリを提供しています。たとえば、PHPフレームワークのLaravelは、イベントブロードキャストシステムによってロングポーリングをサポートしています。
    
3.  Python：[Pythonは](https://www.pubnub.com/blog/socket-programming-in-python-client-server-p2p/)、ロングポーリングを実装するために使用できるもう一つの汎用的な言語です。DjangoやFlaskのようなPythonフレームワークは、ロングポーリング技術を使ったリアルタイムアプリケーションを構築するためのツールやライブラリを提供しています。
    
4.  Ruby：[Rubyは](https://www.pubnub.com/docs/sdks/ruby)動的でオブジェクト指向のプログラミング言語であり、ウェブ開発に適している。人気のあるWebフレームワークである[Ruby on Railsは](https://rubyonrails.org/)、様々なライブラリや拡張機能を通じてロングポーリングをサポートしています。
    
5.  Java：[Javaは](https://www.java.com/en/)エンタープライズ開発で広く使われている言語で、ロング・ポーリングをサポートしている。SpringやJava EEなどのJavaフレームワークは、リアルタイムアプリケーションにロングポーリングを実装するためのライブラリやツールを提供しています。
    
6.  .NET/C#：[プログラミング言語C#を](https://www.pubnub.com/docs/sdks/c-sharp)持つ[.NETフレーム](https://dotnet.microsoft.com/en-us/learn/dotnet/what-is-dotnet-framework)ワークは、ウェブアプリケーションの構築によく使用されます。ASP.NET[SignalRの](https://www.pubnub.com/guides/what-is-signalr/)ような、ロングポーリング技術の実装を簡素化するライブラリやフレームワークが提供されています。
    

これらはロングポーリングをサポートするプログラミング言語のほんの一例です。他の多くの言語やフレームワークでも、リアルタイムチャットやメッセージングアプリケーションにロングポーリングを実装することができます。

ロングポーリングを実装するプログラミング言語を選択する際には、考慮すべきいくつかの要素があります。まず、アプリケーションの具体的な要件を考慮し、その要件に最適な言語を選択します。スケーラビリティ、パフォーマンス、バックエンドでの実装のしやすさを考慮してください。

さらに、プログラミング言語を取り巻くコミュニティやエコシステムを考慮する。強力で活発なコミュニティは、サポート、チュートリアル、ドキュメント、リソースを提供し、アプリケーションへのロングポーリングの実装を容易にします。

ロング・ポーリングはリアルタイム・アプリケーションでどのように使用されますか？
---------------------------------------

ロングポーリングの主な利点の1つは、リアルタイム更新を効率的に配信できることです。クライアントから送信されるリクエストの数を最小限に抑えることで、ネットワークの待ち時間が大幅に短縮され、全体的なパフォーマンスが向上します。さらに、サーバーが更新を即座にクライアントにプッシュできるため、メッセージや通知が迅速に配信されます。

さらに、長いポーリングはリアルタイム・アプリケーションのスケーラビリティを促進します。オープン接続の数を減らすことで、サーバーはより多くの同時接続クライアントを処理できるようになります。これは、ユーザー数が常に変動するチャットやメッセージング・アプリケーションでは特に重要です。

ロングポーリングは、システムリソースの節約に役立ちます。従来のポーリングでは、更新がなくても、各リクエストの処理と応答をサーバーに要求します。この絶え間ない処理はサーバーリソースに負担をかけ、パフォーマンスに悪影響を及ぼします。対照的に、ロング・ポーリングでは、新しいデータが利用可能になったとき、またはタイムアウトが発生したときにのみ、サーバーの処理が開始されます。これにより、システムリソースへの負担が最小限に抑えられ、スケーラビリティと信頼性が向上します。

しかし、ロング・ポーリングの実装にはいくつかの課題もある。そのひとつは、サーバーリソースの効率的な管理です。ロング・ポーリングでは接続を長時間オープンにしておく必要があるため、複数の同時接続を処理するにはかなりのサーバー・リソースが必要になる。これには、クラウド・コンピューティング、オートスケーリング、[コンテナ化などの](https://www.pubnub.com/blog/buzzword-microservices-serverless-functions-programmable-infrastructur/)技術を使用することで、需要に応じて動的にリソースを割り当てることができます。アクティブな接続数に基づいてリソースを自動的に増減することで、開発者はサーバーが予想される負荷を効率的に処理できるようにすることができます。

もうひとつの課題は、タイムアウトや接続障害の処理です。長いポーリングでは、サーバーは新しいデータが利用可能になるかタイムアウトが発生するまでリクエストをオープンにしておく。タイムアウトが発生した場合、サーバーはそれを潔く処理し、接続を閉じてリソースを解放しなければならない。さらに、接続が失敗した場合、サーバーはそれを検出し、再接続の試みを適切に処理できなければならない。堅牢なエラー処理と接続管理メカニズムを実装することで、開発者はリアルタイム・アプリケーションにおけるロング・ポーリングの信頼性を確保することができます。

リアルタイムアプリケーションにロングポーリングを実装する場合、セキュリティも重要な考慮事項のひとつです。ロングポーリングではクライアントとサーバ間の持続的なコネクションを維持する必要があるため、機密データを保護するためにコネクションをセキュアにすることが極めて重要です。セキュア・ソケット・レイヤー（SSL）またはトランスポート・レイヤー・セキュリティ（TLS）プロトコルを実装することで、ロング・ポーリング接続で送信されるデータを暗号化し、盗聴や不正アクセスを防ぐことができます。

月間8億人のアクティブユーザーと99.999%の信頼性をサポートする世界15カ所以上の拠点があるため、障害や同時実行数の制限、トラフィックの急増による遅延の問題を心配する必要はありません。PubNubはリアルタイムデータを必要とするあらゆるアプリケーションに最適です。

[無料トライアルに](https://admin.pubnub.com/#/register)ご登録いただくと、月間200MAUまたは100万トランザクションまでご利用いただけます。

PubNubはどのようにお役に立ちますか？
=====================

この記事は[PubNub.comに](https://pubnub.com/guides/long-polling/)掲載されたものです。

PubNubのプラットフォームは、開発者がWebアプリ、モバイルアプリ、IoTデバイス向けにリアルタイムのインタラクティブ機能を構築、提供、管理できるよう支援します。

私たちのプラットフォームの基盤は、業界最大かつ最もスケーラブルなリアルタイムエッジメッセージングネットワークです。世界15か所以上で8億人の月間アクティブユーザーをサポートし、99.999%の信頼性を誇るため、停電や同時実行数の制限、トラフィックの急増による遅延の問題を心配する必要はありません。

PubNubを体験
---------

[ライブツアーを](https://www.pubnub.com/tour/introduction/)チェックして、5分以内にすべてのPubNub搭載アプリの背後にある本質的な概念を理解する

セットアップ
------

[PubNubアカウントに](https://admin.pubnub.com/signup/)サインアップすると、PubNubキーに無料ですぐにアクセスできます。

始める
---

[PubNubのドキュメントは](https://www.pubnub.com/docs)、ユースケースや[SDKに](https://www.pubnub.com/docs)関係なく、あなたを立ち上げ、実行することができます。