16

私はこのスニペットを見ました:

サーバー上

io.sockets.on('connection', function(socket) {
  const subscribe = redis.createClient();
  const publish = redis.createClient();

  socket.on('publish', function(channel, data) {
    publish.publish(channel, data);
  });

  socket.on('psubscribe', function(channel) {
    subscribe.psubscribe(channel);
  });

  subscribe.on("pmessage", function(pattern, channel, message) {
    socket.emit('message', { channel: channel, data: message });
  });
});

クライアント上

$(".action").click(function() {
  socket.emit('publish', 'game.#{gameid}.action.' + $(this).data('action'),
  JSON.stringify({ nick: "#{nick}", ts: Date.now() })
);

なぜだろう?Socket.IO には独自のブロードキャスト メカニズムがありませんか? Socket.IO ではなく Redis の Pub-Sub を選ぶ理由 このようにすることはできません:

io.sockets.on('connection', function(socket) {
  socket.on('action', function(channel, data) {
    socket.broadcast.to(channel).emit(data)
  });
});

また、Redis を使用する理由があるとすれば、その利点は何でしょうか? 持続性?

4

2 に答える 2

16

リアルタイムアクティビティストリームプロジェクト(http://blog.cloudfoundry.com/2012/06/05/node-activity-streams-app-2/)でSocket.ioでRedis Pub Subを使用することを選択した理由は、複数のWebサーバー(Cloud FoundryのインスタンスまたはHerokuのdyno)が必要でした。私が見る限り、Socket.ioはメッセージを(1つのWebサーバーの)メモリに保存します。それでは、別のWebサーバーに接続されているクライアントにメッセージをブロードキャストするにはどうすればよいでしょうか。

投稿をチェックして、それが役立つかどうか私に知らせてください

于 2012-10-21T19:21:53.030 に答える
2

ここでは少なくとも 2 つの理由で Redis が使用されています。1 つ目は、psubscribe へのパターン マッチングに基づいてメッセージを選択できるなど、パブリッシュおよびサブスクライブのメカニズムとして非常にうまく機能することです。2 番目の理由は、他のクライアントが redis メカニズムを介して簡単に発行および購読できることです。それが不可能だと言っているのではなく、便利なだけです。これは、node.js の非同期性と相まって、強力なパートナーシップを形成します。

もちろん、それが唯一の解決策ではありませんが、かなりうまくいくようです。

于 2012-06-15T06:49:07.533 に答える