支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡


はじめに

インターネット等のネットワークを介したサービスはパソコンだけでは成り立たず、ユーザーが出したリクエストに対してサーバーが応答し、要求されたものを返すことで意味を成します。ホームページを閲覧するのも同じ仕組みで、ユーザーがこのページを見たいとネットワークを経由してそのデータを持っているサーバーに行き着くと、サーバー側が閲覧に必要なデータをパソコンに転送してくれてホームページが見られるようになります。この通信にはHTTPを利用しますが、HTTPはあくまでユーザー側のリクエストというアクションをトリガーとしてサーバー側が応答するという一方通行のやり取りが基本のプロトコルです。対して今回紹介する「Websocket」はユーザー側とサーバー側の双方向で独立したやり取りが可能となっていて、近年多様化するWebサービスには欠かせない仕組みとなっています。この記事では「Websocket」について詳しく紹介していきます。

Websocketの概要

Websocketはサーバー側から能動的にユーザー側へデータを送信できる仕組みで、このことを一般的に双方向の通信と呼んでいます。通常のHTTP通信もリクエストとレスポンスという形で通信が発生しているで双方向の通信はできているように思いますが、サーバーからのレスポンスはユーザーからのリクエストがあった場合にのみ発生するのに対して、Websocketでのサーバーからの通信はリクエストがなくても発生するという点が異なります。ただしWebsocketも最初のHTTPでの接続を確立させる必要があり、HTTPの仕様を利用しつつWebsocketへのアップグレードをすることで双方向の通信ができるようになります。

なおユーザーからWebsocketでの通信要求があった場合、サーバー側でWebsocketに対応していない、あるいは要求されたWebsocketのバージョンに対応できない場合は、その時点でコネクションを切断される点に注意が必要です。またWebsocketは「フレーム」という単位でデータを送信します。フレームはパケットとほぼ同義で同様のものと考えて問題ないですが、WebsocketにおけるフレームはHTTPでのパケット通信に比べて小さいサイズでデータの送信が可能ということを覚えておきましょう。

Websocketの通信上の位置づけですが、WebsocketはHTTPやFTP等の同じプロトコルの一種で、プロトコルの役割を階層化して分かりやすくしたOSI参照モデルで言う第4階層(トランスポート層)に位置していてTCPに依存しています。HTTPとは異なるプロトコルと定義されているものの互換性はあり、ポートもHTTPと同じ443や80を利用します。

これまでの双方向通信について

Websocketは2011年に標準化されたプロトコルで歴史は浅いですが、もちろんそれ以前にも双方向通信が必要なシステムは存在していました。その場合はどのような方法が採られていたかというと、2005年頃からはJavaScriptのAPI「XMLHttpRequest (XHR)」等を使い、さらにはページの再読み込みを行うことなく一部の表示内容を変更できる「AJAX」の仕組みを利用して擬似的なプッシュ通信を確立させていました。特にロングポーリングという手法が多く採られ、HTTP通信のままサーバー側からの能動的な通信に見えるやり取りが可能でした。

しかし実際にロングポーリングを行うためにはユーザー側が何の要求もないいわゆる空っぽのリクエストを送信してサーバーはそれを無視したうえで接続だけを保留しておきます。そのうえでサーバー側からデータを送信するという仕組みになるため、多くのユーザーが接続していると大量の保留状態の接続が発生し負荷が発生しかねないので、この状態に対応できるだけの仕組みやスペックが必要となる手法でした。またHTTPでのその他処理が必要となるため短時間での通信が必要となるシステムには不向きでした。この問題点を解消すべくシンプルで効率的、かつリアルタイムで低コストに双方向通信ができるよう開発されたのがWebsocketとなります。なおWebsocketにおいても双方向通信を行うための接続状態の維持は必要です。

Websocketが使われるサービス

Websocketを実装できるプログラミング言語はサーバーサイドで動くJavaScriptのNode.js、Java、Ruby、Oython、C++、.NET、Erlang等で、例えばNode.jsでは「Socket.IO」というライブラリを、Javaでは「Jetty」というミドルウェアをそれぞれの言語で利用してコーディングを行います。以上のように、Webシステムで良く利用される言語の多くがWebsocketに対応できていると言えます。

Websocketが必要となるサービスとしてはSNSやチャットアプリ、オンラインゲーム、オンライン会議システム等が挙げられます。一昔前までビジネス上でのメッセージのやり取りにはメールやグループウェアが利用されていましたが、近年はリアルタイムで気軽にコミュニケーションが取れるチャットがメインとなっている傾向にあります。リアルタイムにメッセージのやり取りができることチャットのメリットを実現するためにWebsocketが役立ちます。またオンラインゲームも多くの人となるべくタイムラグなく同じ情報を共有しなければならないためWebsocketでの通信は欠かせません。さらにオンライン会議のシステムや、会議の際に資料共有する機能にもWebsocketが使われることがあります。

Websocketを提供しているサービス

Websocketは、Achex、Amazon API Gateway、Pusher Channels、Websocket.IN等のサービスで提供されています。AchexやPusher Channelsは提供された時期が早く、いずれも試しに利用するだけであれば無料で使えます。なおPusher Channelsに関しては500接続までが無料ですが、10,000接続では499ドル/月のコストが必要となります。またWebsocket.INも無料で利用可能ですが、10ドル/月支払うだけでメッセージ数無制限となります。Amazon API Gatewayは、それ自体はAPIゲートウェイを提供するAPI作成サービスですが、Lambdaと組み合わせることでWebsocket通信を利用したサービスを構築できます。他にもREST API、HTTP APIの作成が可能です。

まとめ

Websocketを各プログラミング言語で使いこなせるようになると、提供できるサービスの幅も広がってきます。ライブラリ等があらかじめ提供されているため使い方自体は決して難しくないですが、正しく理解して利用しないとセキュリティ上のリスクに晒される可能性があり、サーバーの負荷原因を生み出してしまうことにもなりかねません。ぜひ今回の記事を参考にWebsocketを正しく理解し、双方向通信が必要となる便利なサービスの開発を進めてみてはいかがでしょうか。