web-dev-qa-db-ja.com

Engine.ioまたはSockJS、どちらを選択しますか?

最近、メモリリークとスケーリングの問題に関してSocket.ioで問題が発生しました。 Socket.ioを使用するという私の決定は、間違いなく使用するのに最適なライブラリである1年以上前に行われました。

Socket.ioが多くの問題を引き起こすようになったので、その間に利用可能になった代替手段を探すのに時間を費やし、Engine.ioとSockJSの両方が一般的に私に適していると思います。しかし、私の意見では、どちらにもいくつかの欠点があり、どちらを選ぶべきかわかりません。

Engine.ioは基本的にSocket.ioの完璧な軽量バージョンで、とにかく必要のない機能がすべて含まれているわけではありません。 Socket.ioの独自の再接続とハートビートロジックを既に作成しました。デフォルトのロジックに満足できず、Socket.ioが提供する部屋やその他の機能を使用するつもりもなかったためです。

しかし、私の意見では、Engine.ioの主な欠点は接続の確立方法です。クライアントは、より遅いjsonpポーリングで始まり、より良いトランスポートをサポートする場合にアップグレードされます。 WebSocketをネイティブにサポートするクライアント(数は着実に増加している)が、古くなったブラウザを使用するクライアントよりも長く不安定な接続手順という形で不利であるという事実は、その処理方法に関する私の感覚と矛盾しています。

一方、SockJSは、私が望むように接続を正確に処理します。私が読んだことから、Engine.ioには現時点でいくつかの問題がありますが、かなり安定しているようです。

私のアプリは単一ドメインのNginxルーターの背後で実行されているため、SockJSが提供するクロスドメイン機能は必要ありません。ただし、この機能を提供するため、SockJSはクライアントのCookieデータをまったく公開しません。これまでのところ、Cookieとクエリ文字列トークンを介したSocket.ioの2要素認証がありましたが、これはSockJSでは不可能です(Engine.ioでは可能です)。

両方の長所と短所のほとんどすべてを読みましたが、これまでのところ、特にEngine.ioについてはあまり議論も公開もされていないようです(engine.ioでタグ付けされた質問は8つだけです)。

  • 2つのライブラリのうち、どちらを好むのか、またその理由は何ですか?本番環境で使用しますか?

  • どちらがより積極的に維持される可能性が高く、将来、他のどれよりも大きな優位性を持つことができますか?

34
1nsane

Primus を見ましたか?あなたが言及したクッキーの要件を提供し、利用可能なすべての major 'real-time'/websocketライブラリをサポートし、かなり活発なプロジェクトです。私にとっては、ベンダーのロックインが懸念事項であり、Primusがそれに対処しているようにも思えます。

プラグインシステム を使用するという事実は、a)必要に応じて拡張しやすくする必要があり、b)実際に コミュニティプラグイン を使用して、必要なことを既に実行している可能性があります。

2つのライブラリのうち、どちらを好むのか、またその理由は何ですか?本番環境で使用しますか?

私はVert.x APIを介してSockJSのみを使用しましたが、「プロダクション」と見なすのは内部プロジェクト用でしたが、プロダクション向けのコンシューマアプリではありませんでした。とはいえ、非常にうまく機能しました。

どちらがより積極的に維持される可能性が高く、将来、他のどれよりも大きな優位性を持つことができますか?

Engine.io および SockJS のコミット履歴と、AuttomaticがEngine.ioをサポートしているという事実を見ているだけで、より安定するだろうと思うようになります。より長い期間ですが、もちろん議論の余地があります。 Engine.io および SockJS の問題を調べるのも評価に適した場所ですが、これらは両方とも複数のレポジトリに分割されているので、一粒の塩を取る必要があります。 AutomatticがEngine/Socket.ioをどこで/どのように使用しているかはわかりませんが、WordPress.comまたはそのプラグインの1つである場合、大規模な実稼働環境でのバトルテストが行​​われます。

編集:回答を変更して、Primusの著者が以下のコメントで確認したCookieサポートを反映します

5
brennebeck

SockJSとEngine.ioに関するこの(非常に詳細な)ディスカッションスレッドにリダイレクトしたいと思います。

https://groups.google.com/forum/#!topic/sockjs/WSIdcY14ciI

基本的に、

SockJSは、接続をオープンとしてマークする前に、作業中のトランスポートを検出します。 Engine.ioはすぐに接続を開き、後でアップグレードします。

flash、Engine.ioフォールバックの1つ(およびSockJSにnotが存在する)がゆっくりとロードされるプロキシの背後の環境は、タイムアウトまで3秒かかります。

SockJSはフラッシュを使用しないため、この問題を回避する必要はありません。

SockJSは起動時にアップグレードを行います。その後、あなたは一貫した経験をします。送信したものを送信し、受信したものを受け取ります。

また、私が知る限り、engine.ioのengine.io-client(クライアント側)ライブラリはrequirejsビルドをサポートしていないため、もう1つのマイナス点があります。 (SockJSは完全にビルドされます)。

1
kumarharsh

node-walve を検討することもできます。完全なWebSocket基本。完全なストリームベースとして非常にパフォーマンスが高い。

使用方法の例:

walve.createServer(function(wsocket) {
  wsocket.on('incoming', function(incoming) {
    incoming.pipe(process.stdout, { end: false });
  });
}).listen(server);

Nodejs環境で安全でないと感じ(APIシュガーのプロトタイプを拡張するなど)、プロジェクトに貢献している場合(コードはsocket.ioとして読みやすくなっていますが)、最良の選択ではないかもしれません。

0
bodokaiser