Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis Pub Sub或Socket.IO的广播_Redis_Real Time_Socket.io_Publish Subscribe - Fatal编程技术网

Redis Pub Sub或Socket.IO的广播

Redis Pub Sub或Socket.IO的广播,redis,real-time,socket.io,publish-subscribe,Redis,Real Time,Socket.io,Publish Subscribe,我看到了这个片段: 在服务器上 客户 我想知道为什么?Socket.IO没有自己的广播机制吗?为什么选择Redis的Pub Sub而不是Socket.IO?我们不能这样做吗: io.sockets.on('connection', function(socket) { socket.on('action', function(channel, data) { socket.broadcast.to(channel).emit(data) }); }); 如果有理由使用Redis

我看到了这个片段:

在服务器上 客户 我想知道为什么?Socket.IO没有自己的广播机制吗?为什么选择Redis的Pub Sub而不是Socket.IO?我们不能这样做吗:

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

如果有理由使用Redis,它的好处是什么?持久性?

这里使用Redis至少有两个原因。第一个是它作为发布和订阅机制工作得非常好,包括能够基于模式匹配选择消息以进行PSU订阅。第二个原因是其他客户端可以轻松地通过redis机制发布和订阅。这并不是说这是不可能的,只是方便而已。这与node.js的异步性相结合,形成了强大的合作关系


当然,这不是唯一的解决方案,但似乎效果相当不错。

我之所以选择在实时活动流项目中使用Redis Pub Sub with Socket.io,是因为我希望在Cloud Foundry上有多个web服务器实例,或者在Heroku上有多个dynos实例。据我所见,Socket.io将消息存储在一个Web服务器的内存中,那么它如何可能向连接到另一个Web服务器的客户端广播消息呢


查看并让我知道它是否有帮助

你关于坚持的答案似乎是个好答案。多进程和多机器缩放肯定是另一种选择。谢谢!没有考虑到扩展问题。Redis不会保留任何关于发布/订阅的内容。它甚至不会在内存中对项目进行排队。我想的是,即使服务器在从客户端接收事件后死亡,并且无法广播,使用Redis,其他客户端仍将接收该事件。但是,如果redis客户端死了,那么是的,根本就没有持久性:所以这不是一个很好的理由。我认为在这里使用redis的主要原因是,如果有可能非套接字希望信息被广播。Redis与其他客户端协同工作,允许您制作的其他应用程序订阅正在发生的事情。但是没有深入研究,我想浏览一下使用Redistore和socket.io的情况,它的文档很差,因为我认为最终会在内部使用Redis的发布/订阅系统,从而实现可伸缩性。很抱歉,我仍然不认为这两个原因比socket.io发布-订阅更好。我想这是因为我并不真正需要消息的模式匹配,即使它是一个功能非常强大。你说的其他客户端是指除浏览器以外的其他客户端?
$(".action").click(function() {
  socket.emit('publish', 'game.#{gameid}.action.' + $(this).data('action'),
  JSON.stringify({ nick: "#{nick}", ts: Date.now() })
);
io.sockets.on('connection', function(socket) {
  socket.on('action', function(channel, data) {
    socket.broadcast.to(channel).emit(data)
  });
});