使用socket.io广播功能和在Redis上使用pub / sub设计架构有什么区别?
例如,在另一个例子中,node.js服务器正在监听(socket.io)CRUD请求(创建)“key”(模型“todo”)和值“data”。它收到它的那一刻,它再次向同一个用户发出,并向在同一个“频道”上收听的所有用户广播。
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“广播”某种方式的方法,并且正在使用带有Redis的pub / sub平台来实现key:value函数。例如,在另一种情况下,我们正在监听基于“密钥”(模型),函数(创建)和值(数据)的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体系结构适用于不支持“实时”的平台,如Ruby,与Node.js相比,它本身支持它。。我错了吗?
答案 0 :(得分:0)
Socket.io的广播方法将广播到连接到当前Node.js服务器的所有套接字,但如果您的应用程序变得流行并且您需要多个服务器来托管所有socket.io连接,该怎么办?使用Redis的Pub / Sub,您的消息可以一次分发到许多服务器。
答案 1 :(得分:0)
您可能想看一下Socket.io中的RedisStore。您可以将socket.io设置为使用RedisStore,而不是使用MemoryStore。这样您就可以扩展您的应用程序。
http://www.ranu.com.ar/2011/11/redisstore-and-rooms-with-socketio.html
如此处所提到的(https://stackoverflow.com/a/9275798/327004),将Socket.io与RedisStore一起使用可能会导致会话出现问题,因为会话不会在工作人员之间共享。