场景如下: 1万个用户,分布在不同的node.js server中,当你登录时,如何通知到你的好友,你已经上线?
我的问题是: 1.如何知道你的好友已经上线? 2.如何发送消息给你的好友(他可能在另外的server中)?
很有意思的问题。我是这么想的:
三层结构
外层:browser 客户端 用 socket.io client 中层:nodejs web server 运行 socket.io server 和 socket.io client 内层:nodejs web server 运行 socket.io server
外层 socket.io client 和 中层 socket.io server 交互 中层 socket.io client 和 内层 socket.io 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轻松解决,关键是这种通知类的信息比较麻烦,不晓得大家伙有没有更加好的办法?