Meteor 通过socketio重新思考动态pubsubs的DB模式
来自流星世界&我很好奇如何复制缓存的pubsub/observators功能。举个基本的例子,假设我有一个todo列表,其中每个todo都有一个Meteor 通过socketio重新思考动态pubsubs的DB模式,meteor,socket.io,rethinkdb,Meteor,Socket.io,Rethinkdb,来自流星世界&我很好奇如何复制缓存的pubsub/observators功能。举个基本的例子,假设我有一个todo列表,其中每个todo都有一个用户ID,我想让每个用户ID(但是用户ID可以存在于多个连接的设备上,例如电话+桌面)。我想我必须创建一些发布函数,通过发送的请求中的socketId验证userId,然后创建一个特定于该查询的套接字名称空间(因为该查询可能包含不止一个userId约束)。然后,注册一个发射器,该发射器只将更改发送到那些已验证为侦听给定命名空间的socketIds。我接近
用户ID
,我想让每个用户ID
(但是用户ID
可以存在于多个连接的设备上,例如电话+桌面)。我想我必须创建一些发布函数,通过发送的请求中的socketId
验证userId
,然后创建一个特定于该查询的套接字名称空间(因为该查询可能包含不止一个userId
约束)。然后,注册一个发射器,该发射器只将更改发送到那些已验证为侦听给定命名空间的socketId
s。我接近了吗?我所有的研究只是根据关键字向所有连接的用户返回一些基本的东西,比如发布。任何阅读材料的链接都会很棒!这是注释中缺少逻辑的第一次尝试
export function sendTodosByUserId(io, userId) {
//How to auth? By linking a client socketId to a user in a lookup table?
connect()
.then(conn => {
r
.table('todos')
.filter(todos => todos("userId").eq(userId))
.changes().run(conn, (err, cursor) => {
cursor.each((err, change) => {
//Do I emit a unique message? namespace? How do I handle 2 clients using the same userId?
io.emit('TODO_CHANGE', change);
});
});
});
}
您可以实现某种将新套接字映射到正确用户的方法。例如,您可以将
用户ID
放在一个简单的对象中,并将用户的套接字ID存储在一个简单的对象中
var userSockets = {};
io.sockets.on('connection', function(socket) {
var userId = socket.handshake.session.userId;
if(userSockets[userId]) {
userSockets[userId].push(socket.id);
} else {
userSockets[userId] = [socket.id];
sendTodosByUserId(io, userId)
}
socket.on('disconnect', function() {
var i = userSockets[userId].indexOf(socket.id);
userSockets[userId].splice(i);
if(userSockets[userId].length === 0) {
delete userSockets[userId];
}
});
});
在您的sendTodosByUsedId
中,您只需在属于用户的套接字数组上循环,并向每个套接字发射
var sockets = userSockets[userId];
for(var i = 0; i < sockets.length; ++i) {
io.to(sockets[i]).emit('TODO_CHANGE', change);
}
关于待办事项变更:
io.to('user:' + userId).emit('TODO_CHANGE', change);
您可以实现某种将新套接字映射到正确用户的方法。例如,您可以将
用户ID
放在一个简单的对象中,并将用户的套接字ID存储在一个简单的对象中
var userSockets = {};
io.sockets.on('connection', function(socket) {
var userId = socket.handshake.session.userId;
if(userSockets[userId]) {
userSockets[userId].push(socket.id);
} else {
userSockets[userId] = [socket.id];
sendTodosByUserId(io, userId)
}
socket.on('disconnect', function() {
var i = userSockets[userId].indexOf(socket.id);
userSockets[userId].splice(i);
if(userSockets[userId].length === 0) {
delete userSockets[userId];
}
});
});
在您的sendTodosByUsedId
中,您只需在属于用户的套接字数组上循环,并向每个套接字发射
var sockets = userSockets[userId];
for(var i = 0; i < sockets.length; ++i) {
io.to(sockets[i]).emit('TODO_CHANGE', change);
}
关于待办事项变更:
io.to('user:' + userId).emit('TODO_CHANGE', change);
谢谢不幸的是,我认为这不会垂直或水平扩展,如果socketId更改,甚至可能在重新连接时失败。。。我想还在找那颗银弹。现在,我已经选择了SocketCluster谢谢!不幸的是,我认为这不会垂直或水平扩展,如果socketId更改,甚至可能在重新连接时失败。。。我想还在找那颗银弹。现在,我已经决定使用socketcluster