8

誰かがちょっとした疑問で私を助けてくれれば幸いです。

socket.io ブロードキャスト機能を使用することと、Redis で pub/sub を使用してアーキテクチャを設計することの違いは何ですか?

たとえば、さらなる例では、node.js サーバーは、「キー」(モデル「todo」) と値「データ」の CRUD 要求 (作成) をリッスン (socket.io) しています。それを受信した瞬間に、同じユーザーに再度送信し、同じ「チャンネル」で聞いているすべてのユーザーにブロードキャストします。

socket.on('todo:create', function (data, callback) {
    var id = guid.gen()
      , todo = db.set('/todo/' + id, data)
      , json = todo._attributes;

    socket.emit('todos:create', json);
    socket.broadcast.emit('todos:create', json);
    callback(null, json);
});

しかし、socket.io を使用して何かを「ブロードキャスト」する別の方法があり、key:value 関数に Redis で pub/sub プラットフォームを使用しています。たとえば、別のケースでは、"キー" (モデル)、関数 (作成)、および値 (データ) に基づく CRUD リクエストをリッスンしています。ただし、この場合、受信すると、「socket.broadcast.emit()」経由では送信されず、Redis で公開されます。

socket.on(key + ':create', function (data, callback) {
  var t = new ModelClass(data)
    , name = '/' + key + ':create';
  t.save(function (err) {
    pub.publish(key, JSON.stringify({key: name, data: t}));
  });
});

したがって、サーバー側では、モデルに加えられた (および Redis に公開された) すべての変更がキャッチされ (ハンドラー)、ユーザーのクライアント側 (私の場合は backbone.js) に送信され、それに従ってモデルがレンダリングされます。受信したキー:値:

sio.on('connection', function (socket) {

   sub.on('message', function (channel, message) {
      var msg = JSON.parse(message);
      if (msg && msg.key) {
          socket.emit(msg.key, msg.data);
      }
});

だから私の質問は非常に単純です:-):両方のアーキテクチャの違いは何ですか? どちらがよりスケーラブルですか? より良いデザイン?モードアドバンス?

pub/sub アーキテクチャは、「リアルタイム」をネイティブにサポートする Node.js とは対照的に、Ruby のように自然に「リアルタイム」をサポートしないプラットフォームに適しているように見えます。. 私が間違っている?

4

2 に答える 2

1

Socket.ioのブロードキャストメソッドは、現在のNode.jsサーバーに接続されているすべてのソケットにブロードキャストしますが、アプリケーションが普及し、すべてのsocket.io接続をホストするために複数のサーバーが必要になった場合はどうなりますか?RedisのPub/Subを使用すると、メッセージを一度に多数のサーバーに配信できます。

于 2012-07-02T04:35:54.693 に答える
1

Socket.io の RedisStore を参照してください。MemoryStore を使用する代わりに、RedisStore を使用するように socket.io を設定できます。アプリケーションをスケールアップできるようにします。

http://www.ranu.com.ar/2011/11/redisstore-and-rooms-with-socketio.html

ここ ( https://stackoverflow.com/a/9275798/327004 ) で述べたように、RedisStore で Socket.io を使用すると、セッションがワーカー間で共有されないため、セッションでいくつかの問題が発生する可能性があります。

于 2012-07-12T17:21:36.387 に答える