13

このトピックに関するいくつかの質問がありますが、問題に完全に対処するものはありません。

redis-store で Socket.IO を使用しており、トラフィックの増加に備えています。私のホスティング会社は、「より効率的なため、Socket.IO の代わりに Engine.IO を使用する必要がある」と言いました。

このような質問には、一見相反する答えがあります。

だから私はそれを見る方法:

  • Socket.IO 0.9 の劣化
  • Engine.IO の強化
  • Socket.IO 1.0 は Engine.IO を使用します
  • 複数のインスタンスで Engine.IO を実行する場合は、自分で redis ストアを作成する必要があります

しかし、Engine.IOは「ロード バランサーに優しい」と言っていますが、redis については何も言いません。なんらかの外部店舗があるはずですよね?しかし、複数のトランスポートと 1 つのストアがある場合、Socket.IO のポイントは何でしょうか?

その後、Socket.IOが放棄される可能性があり、知名度の高い企業がPrimusに移行していることがわかります。

Engine.IO をスケーリングするにはどうすればよいですか? ストアを自分で書く必要がありますか?

4

3 に答える 3

10

先週学んだことを共有したかっただけですが、他の誰かが来て、これに明確に答えてくれることを願っています。

1) Socket.IO を使用しない (0.9.16 以降)

私のホストは、Engine.IO (またはその他のもの) を使用するように私に指示しました。Socket.IO には多数の重大な問題があり、最悪の場合、サーバーが予期せず DDoS攻撃を行うことです。私は比較的少数のクライアントでこれを直接経験し、Socket.IO を書き直すことができるまでサーバーを完全に無効にしました。打撃を吸収するために25以上のドローンにスケーリングしましたが、それは問題ではありませんでした. 1 つのクライアントは、1 秒あたり数千のリクエストを送信できます。

2) 他のエンジンには Redis ストアがない

Socket.IO を使用すると、ノードの Redis ストアにドロップすることでノード間でブロードキャストできます。私の知る限り、Engine.IO、Primus、および SockJS はこれを提供していません。したがって、これらのエンジンが「ロード バランサー」に適していると主張しても、ノード間でブロードキャストできるわけではありません。これは本当に良いことだと思い始めています。redis を使用して pub/sub を作成するのは比較的簡単で、分離されているのは便利です。

最終的にはEngine.IOでPrimusを使用し、ノード間でイベントを共有するためにredis pub/sub を使用しました。Socket.IO を削除し、Primus を接続し、pub/sub を作成し、稼働させるのに約 5 時間かかりました。これまでのところ、はるかに優れた経験になっています。

アップデート:

最終的には Engine.IO も再接続ループ (1 秒に数回) に陥るので、最終的には SockJS を使用しました。最高の接続性と安定性が得られ、Primus が再接続を処理するようになりました(SockJS では処理されません)。

于 2013-08-18T23:07:15.783 に答える
1

v1.0 がリリースされるまで Socket.IO を避けるべきであることに同意します。これにはバグがあり、私のテストでは Engine.IO のパフォーマンスが向上しました ( https://medium.com/node-js-javascript/b63bfca0539 )。Primus も間違いなく良い選択肢です。今は Engine.IO を使用するかもしれませんが、Socket.IO 1.0 がリリースされたらそれに切り替えたいと思うでしょう。

同様のプログラムを Engine.IO と Redis および Pub/Sub 構造で実装しました。非常にエレガントに見えます。以下のコードは、接続されたクライアントをルーム/チャンネルにサブスクライブします。

io.on('connection', function (socket) {
  var observerRedisClient = redis.createClient();
  observerRedisClient.subscribe(resourceId, redis.print);

  observerRedisClient.on('message', function(channel, message) {
      socket.send(message);
  });
});

そして、そのチャンネルを更新すると、つまり. いくつかのデータを保存して公開すると、購読しているすべてのクライアントがそれを受け取ります。

redisClient.set(key, value, redis.print);
redisClient.publish(key, value);

コードがオープン ソースであることに興味がある場合: https://github.com/denizozger/node-engine.io-server

于 2014-01-28T17:40:27.397 に答える