如何使用socket.io做到上线提醒?
发布于 11 年前 作者 wjzheng 9031 次浏览 最后一次编辑是 8 年前

场景如下: 1万个用户,分布在不同的node.js server中,当你登录时,如何通知到你的好友,你已经上线?

我的问题是: 1.如何知道你的好友已经上线? 2.如何发送消息给你的好友(他可能在另外的server中)?

14 回复

很有意思的问题。我是这么想的:

三层结构

外层: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轻松解决,关键是这种通知类的信息比较麻烦,不晓得大家伙有没有更加好的办法?

通知类的消息可以单独系统出来做吧,利用消息队列来下发信息,这样对原系统就影响不大了吧。

在楼主好友上线这个例子,没有必要全网的broadcast。但一个用户上线后,只要查找该用户已经上线的好友,通知这些好友用户就可以了。

比如用 rabbitMQ 之类的异步消息系统。nodejs 有 rabbitMQ 的模块。

请问这个最后是怎么解决的呢?我们也遇到了相同的问题,求解!是采用这个方法吗? “用redis或memerycache 缓存用户的好友列表和全系统的在线用户信息(在线用户信息中包含当前所在server的信息,如IP地址),如果用户的好友列表中有用户在线,则可以找到该在线好友所在的socket.io server的IP地址,将上线消息emit到好友所在的server,好友所在的server收到消息之后,根据该台server中缓存的socket列表,最终可以找到该好友对应的socket连接,并将消息发送出去。”

socket.io还在研究中,不过还是觉得查找好友进行通知比较好,lz说的方案太绕了

@carolyn 同问, 楼主最后是怎么解决的呢?

楼主可以研究下Meteor。

看看网易那个pomelo聊天的例子吧,客户端连接存到session里面,有新用户登录时候就给所有session发送消息就行了。

回到顶部