Microsoftは新たなオープンソースでの貢献として、Windows Azureサービスバスを利用したリアルタイムNode.jsアプリケーションに対するスケールアウトサポートの提供を開始した。このモジュールはsocket.io-servicebusと呼ばれ、人気のSocket.IOモジュールを実行している複数のサーバをつなぐものである。この貢献は、MicrosoftのNode.jsへの傾倒とMicrosoftの製品やサービスへの統合を示すさらなる一例となっている。
これまでも数多くの貢献をしているGuillermo Rauch氏によってつくられたSocket.IOは、開発者がどんな主要ブラウザでも動くリアルタイムNode.jsアプリケーションでWebsocketを使うことができるようにするものである。この卓越したモジュールは、メッセージをサーバからすべての、あるいは、任意のクライアントにプッシュしたいと考える開発者によって月間150,000回以上ダウンロードされている。単一のNode.jsサーバはSocket.IOで数千の同時接続を管理できるが、複数サーバにまたがるアプリケーションを構築しようとする際に困難が生じる。先頃、Socket.IOは複数のサーバにまたがって共有することができる中間ストレージを提供する“store”のサポートを追加した。 Microsoftによって提供されるsocket.io-servicebusモジュールは、Windows Azureサービスバス をstoreとして利用して全ての統合されたNode.jsサーバが接続されたクライアントにメッセージを配信することを可能にする。
Microsoftはここ数年かけてNode.jsに対する特別な思いを育んできた。Windows Azureポータルに専用のNode.jsのための開発センターを持ち、Node.jsアプリケーションをMicrosoftクラウドにデプロイする開発者のための多くのチュートリアルやリファレンスを提供している。そしてまた、Node.js開発者向けにオープンソースモジュールをいくつか作成してきた。オープンソースのAzure SDK for Nodeモジュールは、Windows Azureストレージ(テーブル/キュー/BLOB)、Windows Azureサービスバス、Windows Azure SQLデータベースを含むサービスの一部に簡単にアクセスする機能を提供する。さらに、Microsoft Driver for Node.js for SQL ServerはMicrosoft Windows上で稼動するNode.jsアプリケーションに対して、Microsoft SQL Serverへの基本インターフェースを提供する。MicrosoftのTomasz Janczuk氏によってつくられたクリエイティブなEdge.jsモジュールは、.NETコードをNode.jsコードに統合し、頑健な.NET frameworkへのアクセスを開発者が必要なときに提供する。Microsoftはさらに、自身のフリーな開発環境であるWebMatrixに対してもNode.js開発とデプロイの機能を追加した。
この新しいモジュールについてさらに知るべく、InfoQは、Windows Azureチームのシニアプログラムマネージャであり、Microsoftオープンソース活動のよく知られたエヴァンジェリストであるGlenn Blockに話を聞いた。
InfoQ: このモジュールはSocket.IOのどのような問題を解決するのですか?
Block氏: このモジュールによって、異なる物理マシンや仮想マシン上で稼動する複数のノードインスタンスにまたがってsocket.ioを利用するアプリケーションがスケールアウトできるようになります。単一データセンター内の複数インスタンス上に配置された単一アプリケーションをスケールアウトするために使うこともできますし、複数インスタンスが複数データセンターに分散し、そのうちのいくつかがオンプレミスで動くような環境で、リアルタイムにデータを同期するために使うこともできます。
アプリケーション自体はWindows Azure内にホストされる必要はありません。そのことによってさらに実用性を高めています。
InfoQ: なぜWindows Azureサービスバスなのでしょうか? なぜそれがこの機能を提供するのに適切なWindows Azureサービスだと言えるのでしょうか?
Block: Windows AzureサービスバスはWindows Azureにホストされている非常にスケーラブルかつ冗長なパブリッシュ・サブスクライブ型メッセージングプラットフォームで、位置情報も利用可能です。このことによって、こういった種類のスケールアウトシナリオを扱うのに理想的なものであると言えます。
InfoQ: 具体的にはどのように機能するのでしょうか?
Block: socket.ioはどこにメッセージを保存するかを決定する'store'抽象を提供しています。私たちの新しいモジュールでは、SbStoreを提供して、サービスバストピックを使ってそのトピックをリスンしている複数のsocket.ioインスタンスを同期します。メッセージをsocket.ioクライアントから受け取るたびに、そのメッセージはstoreに送られ、サービスバスを通って各インスタンスに伝わります。その後、各socket.ioインスタンスは直接接続している各クライアントと通信するのです。
ぜひ伝えておくべきだと思うのは、これは私たちの最初のリリースであるということ、そして、はじめてその真価が問われるときだということです。私たちは今後顧客の利用をベースにモジュールのパフォーマンスをチューニングすることになると思います。
InfoQ: このスケールアウトサポートによって、これまでは不可能だったような新たなSocket.IO活用シナリオが可能になると考えていますか?
Block: Windows Azure内にホストしているアプリケーションに対してはYesです。というのも、このサービス自体Azure内にあるからです。同様のエクスペリエンスを提供できるRedisStoreのような代替storeもあります。RedisStoreを使えば、Redis to Goのようなサービスと結合したインメモリデータベースであるRedisを使うことができます。
InfoQ: MicrosoftはNode.jsに惚れ込んでいるように見えます。というのも、多くのクリエイティブなモジュールやチュートリアルをつくり、共有しているからです。Nodeが他のMicrosoft製品が現状ではかなえることのできない独特の要求に応えていると考えているのでしょうか? それとも、Microsoftが人気のあるプラットフォームを抱き込み、そのプラットフォームとの適切な統合を示す一例なのでしょうか?
Block: それは素晴らしい質問です。私はそのどちらかだけとは考えていません。Nodeは人気を獲得しつつある刺激的なプラットフォームですし、非常に豊富なモジュールエコシステムを持ち、それを好む開発者もいます。Windows AzureにおけるNode.jsのサポートは実のところ開発者に代替を提供し、さらに多くの開発者、特に.NETで開発しているわけでもなくハイブリッドソリューションを構築しているわけでもない開発者を我々のプラットフォームに誘うものなのです。