SockJSサーバーパフォーマンス調査

一日の良い時間!



Tornadoを使用して、あらゆる種類のさまざまなプッシュテクノロジに携わっているのは偶然です。 少し前に、 Tornadoの上にあるsocket.ioプロトコルのサーバー側実装であるTornadio2について説明しました



次に、同様のプロジェクトsockjs-tornadoを紹介します。



あまり興味がない人のために、他の有用な情報があります:CPython 2.6.6、sockjs-nodeおよびsocket.io(両方ともnode.js 0.6.5)に対するPyPy 1.7比較負荷テスト。 カットの下のすべて:-)



まず、SockJSとは何ですか? これは、Websocket APIを模倣するjavascriptで記述されたクライアントライブラリですが、ajaxロングポーリング、jsonpポーリングなどの形式でさまざまな代理代替を使用することで、すべてのブラウザーをサポートします。 一般的に、socket.ioに非常に似ていますが、いくつかの重要な違いがあります。



小さな余談-バグレポートを送信し、あらゆる点で開発者を悩ませたことを除いて、ライブラリのクライアント部分とは関係ありません。



では、 socket.ioがあるのになぜ必要なのでしょうか?

SockJSの開発につながった2つの理由を次に示します。

1.バージョン0.7以降のSocket.io開発者は、どこか間違っています。 バグを修正したり、さまざまなブラウザのサポートを追加したりする代わりに、彼らはAPIをより高レベルにすることを決めました。 私は議論しません-すべての革新は非常に便利ですが、エラーの数は減少していません。 たとえば、深刻な十分な競合状態は3か月以上閉じることができません。 切断後の接続はまだ機能しません。 まあなど。

2.特定のライブラリに関連付けられたくない場合があります。 socket.ioを使用する場合、socket.ioへのバインディングがあるすべての場所を変更する必要があるため、放棄することは困難です。



それでは、SockJSとは何ですか?

1.前述のように、これはブラウザのWebsocket APIの単純な代替品です。 したがって、Webソケットを使用して既存のアプリケーションを移動するのは非常に簡単です(サーバー側について話さない場合)

2. SockJSはOperaでも動作しますが、socket.ioはあまり好きではありません。 さらに、SockJSはさまざまなウイルス対策ソフトウェアで正常に動作します。別のトランスポートにロールバックしますが、socket.ioは接続をまったく確立できません。

3. SockJSはストリーミングプロトコルをサポートします。これは、送信データ用のサーバーからの1つの永続的な接続です。 socket.ioは、バージョン0.7以降、ストリーミングトランスポートを放棄しました。

4.プロトコルははるかに単純であり、非常によく文書化されています。 開発者には、サーバー実装が合格する必要がある一連のテストもあります。

5.スケーラビリティがプロトコルに組み込まれています。 たとえば、ロードバランサーは、Cookieを使用してスティッキーセッションを整理する必要はありません。必要な情報はすべてURLに既に含まれています。

6.ライブラリはさまざまな条件で非常によくテストされており、クライアントとサーバーの両方をブラウザーから直接チェックするqunitテストもあります。 たとえば、sockjs-nodeのテストの例を次に示します。http ://sockjs.popcnt.org/



全体として、このことは機能します。



次に、記事の2番目の部分であるパフォーマンスについて説明します。



sockjs-tornadoを作成した後、node.jsで作成された「ネイティブ」サーバーと比較する方法を確認することにしました。 現在node.jsは非常にファッショナブルであり、多くの場合、さまざまなプッシュテクノロジーでのパフォーマンスについて説明しています。 前もって言います-テスト結果は私をとても驚かせました。



テスト方法は非常に簡単に選択されました。チャットサーバーには1つの部屋があります。 サーバーは、各着信メッセージをすべてのチャット参加者に送信するだけです。 興味があるなら、 ここにサーバーコードあります。



pingを送信し、独自の応答を待機しているWebsocketクライアントがあります。 応答を受信した後、送信と受信の間の時間を考慮します。 異なるレベルの同時実行の結果と送信されたメッセージの数が保存され、それらに基づいてグラフが作成されます。



おそらくいくつかは尋ねるでしょう-実際に何がテストされていますか? そして、ここにテストされているものがあります:

-さまざまなサーバーのWebsocketプロトコルの実装速度

-サーバーがチョークし始めるメッセージの最大数

-多数の接続をサポートするオーバーヘッド

-さまざまな負荷レベルでの応答時間



別の質問に、なぜ一般的にロジックのない「ダム」チャットが必要なのですか? 誰かがHumble Indie Bundleのようなプロジェクトに遭遇した場合、獲得した金額はリアルタイムで表示されます。 そのため、彼らは多数のWebクライアントを「保持」する「ブローカー」を使用しています。 また、データソース(プロデューサー)もあります。このデータソースは、ときどき稼いだ金額をブローカーに送信します。 ブローカーは、接続されているすべてのクライアントにこの情報を送信する必要があります。 ブローカーの動作が速いほど、最小限の時間でより多くのクライアントにサービスを提供できます。



この調査は英語で行われました。sockjs開発者はsockjs-nodeとの比較テストを求めており、 ここで確認できます 。 誰か興味があれば、その記事をロシア語に翻訳できます。



要するに、次の図を取得します。

-sockjs-nodeは、平均応答時間200ミリ秒で1秒あたり最大45,000のメッセージを送信できます。

-cpython 2.6.6のsockjs-tornadoは、200 msの応答時間で毎秒最大55,000のメッセージを出力できます

-pypy 1.7のsockjs-tornadoは、1秒あたり150,000件以上のメッセージで「壊れる」だけです。



もちろん、サーバーは毎秒より多くのメッセージを送信できますが、応答時間は増加し、アプリケーションはリアルタイムでなくなります:-)



比較スケジュールはこちらでご覧いただけます 。 X軸には、サーバーによって1秒間に送信されたメッセージの数があります。 y軸は応答時間です。 各行は、同時接続数を含むサーバーの組み合わせ(ノード= sockjs-node、socket.io = socket.ioノード、cpython = cpythonのsockjs-tornado、pypy = pypy 1.7のsockjs-tornado)です。 socket.ioは、node.js上の別のプロジェクトのパフォーマンスの例です。



node.jsとcpythonを比較しなかったとしても、pypyのパフォーマンスは完全に驚きました。



さて、結論として。



socket.ioのオプションを既に検討している場合でも、リアルタイム機能を計画している場合は、SockJSに目を向けることをお勧めします。 そして、sockjs-tornadoが他の誰かに役立つことを願っています。



All Articles