見出し画像

サーバーとリアルタイムな接続を行う方法

外資系企業でソフトウェアエンジニアをしております、タロイモと言います。今日もよろしくお願いします。

WEBにおいて、チャット機能やオンラインゲームなどでリアルタイム処理を実現するには、普通の通信(いわゆるHTTP通信)では難しいところがあります。

今回はWEBにてリアルタイム通信を実現するための技術を、その誕生背景などと共に紹介します。


1. HTTP通信でのリアルタイムチャット

(1)ポーリング
HTTPという通信プロトコルが誕生したのが1991年それから1990年代後半にかけリアルタイム処理が研究されていました。

HTTPはコンピュータ同士のリクエストとレスポンスにより接続を確立します。

このリクエストとレスポンスを用いてリアルタイム接続を行う方法として考えられたのが、ポーリング(polling)です。

例としてクライアントとサーバー間のポーリング通信での会話があります。

クライアント① :「こんにちは、私はここにいます。私に関してなにか新しい情報はありますか?」
サーバー:(クライアント②から情報があったら)「こんにちは。あなたにはこの情報があります」
ー10秒後
クライアント①:「こんにちは、私はここにいます。私に関してなにか新しい情報はありますか?」
サーバー:(クライアント②から情報がなかったら)「こんにちは。あなたには情報がありません」
ー10秒後
クライアント① :「こんにちは、私はここにいます。私に関してなにか新しい情報はありますか?」
サーバー:(クライアント②から情報があったら)「こんにちは。あなたにはこの情報があります」
〜以下繰り返し

ポーリングのデメリットは2つです。
①10秒毎のリクエスト間隔なのでその分だけ遅延が発生します。
②10秒毎にリクエストが来るため、サーバーの処理に負荷がかかります。
→通常のサイトを見る際にはそんなに頻繁にページを変えることはあまりないですよね。

(2)Comet(ロングポーリング)
この遅延とサーバー処理のデメリットを解決する手段として、考えだされたのがComet(コメット)です。
※CometもHTTPを用いて通信を行います

Cometはロングポーリング とも呼ばれ、ポーリングを応用した技術です。

例としてクライアントとサーバー間のComet通信での会話があります。

クライアント① :「こんにちは、私はここにいます。私に関してなにか新しい情報はありますか?」
サーバー:「...」
ークライアント向けにクライアント②から新しい情報が入る
サーバー:「こんにちは。あなたにはこの情報があります」
クライアント① :「こんにちは、私はここにいます。私に関してなにか新しい情報はありますか?」
ークライアント向けにクライアント②から新しい情報が入る
サーバー:「こんにちは。あなたにはこの情報があります」
〜以下繰り返し

ポーリングとの違いが分かりますか。

クライアントが最初にリクエストを送り、コネクションを確立するところは一緒ですが、その後クライアント向けの情報が入るまでサーバーは応答をしません。

ここから、クライアントは頻繁にリクエストを行わなくて済み、さらにサーバーにクライアント向けの情報が入ったらリアルタイムに応答を行うので、遅延が起こりません

Cometは以上のようにポーリングのデメリットを解消することができました。


2. HTTPの代わりとなるWebSocketの誕生

HTTPを用いて双方向通信が可能になり問題ないと思われましたが、HTTPでリアルタイムを行うには無理がありました。

理由は2つあります。
①本来の双方向通信でない。
→ポーリングは擬似的な双方向通信に過ぎません。クライアントからの要求なしにサーバーから発信することはできません。何度もクライアントから要求を行うため、それだけで何かしらのロスがあります。
(相手からの電話を待つのではなく、毎回こちらから相手に電話をかけなくてはいけない負担をイメージしてください。一方向通信は負担があるのです。)
②HTTPコネクションを長時間占有するため、サーバーリソース消費が多い
→HTTP接続ごとにスレッドを作成するため、同時接続数が多いとそれだけ、メモリなどのリソースを大量に消費します。

このようなHTTPでの双方向通信の限界に対応するために2011年、WebSocketという技術様式が誕生しました。

例としてクライアントとサーバー間のWebSocket通信での会話があります。

クライアント① :「こんにちは、私はここにいます。WebSocket君を通じて通信したいです。」
サーバー:「WebSocket君、クライアントさんが呼んでるよ。」
WebSocket:「クライアント①さんとの接続を確立しました。以後私を経由してください。」
ークライアント①向けにクライアント②から新しい情報が入る
WebSocket:「あなたにはこの情報があります」
ークライアント①向けにクライアント②から新しい情報が入る
WebSocket:「あなたにはこの情報があります」
〜以下繰り返し

WebSocketはHTTPに比べて軽量なヘッダで通信コストは低く、2点のメリットがあります
①通信コストが低く、リアルタイム性が高い。
→HTTPと違い、サーバーとクライアント間での接続は一回で済みます。そのため、リクエストとレスポンスに伴う遅延が減ります。
②サーバー負荷が低い。
→サーバーとクライアント間での接続は一回で済み、その一回のみで全てのデータ送受信が行えるためサーバーの負担が減ります。


3. まとめ

今回はサーバーとリアルタイム通信を行う方法について解説しました。
HTTPを用いた擬似的な双方向通信から、WebSocketを用いた真の双方向通信までの流れは理解できたでしょうか。

次回は、WebSocketのライブラリを使いチャットアプリを作ってみようかと思います。

今回もご精読ありがとうございました。





よろしければサポートお願いします! サポートは、サービスの開発・改良や、記事を書く際の素材費とさせていただきます。 少しでも有益な情報発信をしていけるよう努めてまいります。 是非とも応援よろしくお願いします!!!🙇‍♂️