Guillermo Rauch氏がリアルタイムWebアプリケーションのためのJavaScriptライブラリ、Socket.IOのバージョン1.0をリリースした。
今回のリリースには、新しいEngine.IOモジュール、バイナリデータ送信のサポート、マルチノード・スケーラビリティに対する簡易なアプローチが導入されている。
Socket.IOの始まりは、WebSocketプロトコル仕様の始まりと同時期だった。当時、ブラウザで双方向ソケットを使うのは「不可能」だった、とRauch氏は言う。そのため、別の言語やプログラミング環境にあるSocket APIに慣れた開発者は、リアルタイムアプリケーションを構築するのに面倒で遅い代替品を使う必要があった。
Socket.IOを使うことで、クライアントとサーバは任意の種類のデータ構造を持つイベントをやり取りできるようになる。これはチャットルーム、リアルタイム分析プラットフォーム、マルチユーザのドキュメントコラボレーションアプリを実現するのに有用だ。
最新リリースのEngine.IOモジュールは、WebSocketライクなAPIを実装している。これはコードベースがトランスポートやブラウザの非互換性を扱わないことを意味している。Rauch氏によると、この分離はトランスポート層のイノベーションにつながると言う。
"Introducing Socket.IO 1.0" という記事で、Rauch氏はこのモジュール化の利点として「コードベースのサイズとテスト面の単純化」を挙げている。今やサーバは1,234行、クライアントは976行しかない。
トランスポート層に対するアップデートを解決するため、このリリースでは「トランスポート機能検出」を導入し、APIを直接テストして期待通りに振る舞っているか確認する、とRauch氏は語る。
JSONがglobalに存在するかどうかチェックすることは、JSON.stringifyが動作することも、それが存在することも意味してはいません。それはユーザが自分でJSONをglobalに定義したことを意味しているかもしれませんし、その環境にあるJSON実装は実際には壊れているかもしれません。Socket.IOはWebSocketが動いているとは想定しません。実のところ、動いていないことが多いためです。代わりに、まずXHRやJSONPを使ってコネクションを確立し、それからWebSocketへのアップグレードを試みます。
Socket.IOのバイナリサポートはユーザから要求されてきた機能だ。Rauch氏は「本当に役に立つ」サポートを検討しているが、WebSocket APIの後で作ると、サポートは限定されたものになっただろうと言う。これはWebsocket APIではSocketが “string mode” か “binary mode” のいずれかである必要があるためだ。Socket.IOは妥協することなく、データ構造としてBuffer (Node.JSより)、Blob、ArrayBuffer、Fileなどのemitをサポートしている。
Socket.IOのマルチノード・スケーラビリティに対するアプローチは、1.0で簡易化された。新しいリリースはノード間でデータを格納したり複製したりする代わりに、周囲にイベントを渡すことだけに専念している。これは2ステップだけでSocket.IOを複数ノードにスケールできることを意味する。
- スティッキー・ロードバランシング (たとえば、オリジンIPアドレスによる)を有効にする。これにより、たとえばロングポーリング接続が必ずメッセージのバッファが格納されるのと同じノードにリクエストをルートするようにする。
- socket.io-redisアダプタを実装する。
Socket.IO 1.0はSocket#setとSocket#get APIを非推奨にした。ブロードキャスト時はいつでも、パケットはエンコードされて他のノードに配信される。
Rauch氏は、このリリースに対する反応は「すばらしいもの」だと言っているが、最後のメジャーリリースから2年以上経ち、長く待たれていたものだと言う人もいる。Understoodit.comの創業者であるLiam Kaufman氏は、このアナウンスについてHacker Newsにコメントを寄せている。
これは長く待たれていたものです。ようやくSocket.IO 1.0がリリースされ、とてもうれしいです。Pre-1.0には技術的な難題がいくつかありました。
コミュニティの全員が待つだけの価値があったと思っているわけではない。ユーザであるPhilip Wang氏はこう言っている。
私は (Socket.IO 0.9.*におけるメモリ問題に苦しんだ後) すべてのプロジェクトをSockJSに切り替えました。Socket.IOをもう一度試すだけの理由はあるのでしょうか?
AutomatticのソフトウェアエンジニアであるMarco Aurélio氏はこう答えた。
裏で使われている新しいEngine.IOモジュールはすばらしいものです。ロングポーリングから開始して、シームレスにWebSocketsへとアップグレードします (ですから、たとえ古いブラウザやプロキシ環境であっても、毎回非常に高速に開始します)。私の知る限り、これはこれまでとは正反対です (以前はWebSocketsを試してから、ロングポーリングにフォールバックしていました)。またEngine.IOは非常にスケーラブルかつロバストです。
Socket.IO 1.0で発表された機能は他にも、テスト自動化、インテグレーション改善、デバッグ改善、APIのスリム化といったものがある。
Socket.IOはオープンソースであり、MITライセンスのもとリリースされている。このプロジェクトへのコントリビューションに関心があるなら、Githubにあるリポジトリを見てみよう。そしてTwitterで@SocketIOをフォローすべきだ。