场景如下: 1万个用户,分布在不同的node.js server中,当你登录时,如何通知到你的好友,你已经上线?
我的问题是: 1.如何知道你的好友已经上线? 2.如何发送消息给你的好友(他可能在另外的server中)?
结构不是问题,现在的问题是 效率的问题。
现在大部分的例子都是在单机的情况下,当有用户上线时,直接io.sockets.broadcast群发一个消息,但这是个广播消息,效率太低,特别是 在使用 socket.io + redis pub/sub的情况下,一个用户的上下线,就给整个系统是群发一个消息,真是个悲剧.
我自己的想法是 用redis或memerycache 缓存用户的好友列表和全系统的在线用户信息(在线用户信息中包含当前所在server的信息,如IP地址),如果用户的好友列表中有用户在线,则可以找到该在线好友所在的socket.io server的IP地址,将上线消息emit到好友所在的server,好友所在的server收到消息之后,根据该台server中缓存的socket列表,最终可以找到该好友对应的socket连接,并将消息发送出去。
兜了老大的一个圈子,就是为了避免去使去使用全网的broadcast,至于点对点的消息(如:你发送消息给你的好友),这个倒是可以使用 socket.io+redis pub/sub轻松解决,关键是这种通知类的信息比较麻烦,不晓得大家伙有没有更加好的办法?
通知类的消息可以单独系统出来做吧,利用消息队列来下发信息,这样对原系统就影响不大了吧。
在楼主好友上线这个例子,没有必要全网的broadcast。但一个用户上线后,只要查找该用户已经上线的好友,通知这些好友用户就可以了。
比如用 rabbitMQ 之类的异步消息系统。nodejs 有 rabbitMQ 的模块。
请问这个最后是怎么解决的呢?我们也遇到了相同的问题,求解!是采用这个方法吗? “用redis或memerycache 缓存用户的好友列表和全系统的在线用户信息(在线用户信息中包含当前所在server的信息,如IP地址),如果用户的好友列表中有用户在线,则可以找到该在线好友所在的socket.io server的IP地址,将上线消息emit到好友所在的server,好友所在的server收到消息之后,根据该台server中缓存的socket列表,最终可以找到该好友对应的socket连接,并将消息发送出去。”
socket.io还在研究中,不过还是觉得查找好友进行通知比较好,lz说的方案太绕了
和 @carolyn 同问, 楼主最后是怎么解决的呢?
楼主可以研究下Meteor。
jljlkj
yyyy
@wjzheng zzzz
@wjzheng ddadsa
看看网易那个pomelo聊天的例子吧,客户端连接存到session里面,有新用户登录时候就给所有session发送消息就行了。