如果有人能帮助我解决一个小疑问,我将不胜感激。
使用socket.io广播功能和在Redis上使用pub/sub设计架构有什么区别?
例如,在另一个示例中,node.js 服务器正在侦听(socket.io)针对“键”(模型“todo”)和值“数据”的 CRUD 请求(创建)。当它收到它时,它会再次向同一用户发送,并向同一“频道”上收听的所有用户广播。
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);
}
});
所以我的问题很简单:-):两种架构有什么区别?哪一个更具可扩展性?更好的设计?模式提前?
在我看来,发布/订阅架构适用于自然不支持“实时”的平台,比如 Ruby,而 Node.js 本身就支持实时。。我错了吗?