IM 系统设计,关于服务端如何管理连接的 Clients 问题?
RT,问题概况:
- 想做一个类似聊天室的APP,属于没有太多经验正在探索中,看了一些文章没有读太懂,比如我觉得读扩散(Pull)模式适合我,但不懂里面说的发件箱和数据库的表是什么关系。
- 数据库用的
MongoDB
,存储消息建了两个表send_message(主要储存消息内容)、 received_message(主要储存消息相关ID) - 用户建立连接会在
URL
带一个UserId
,因为WebSocket.Server
服务端使用的是ws,所以最终可以拿到带有UserId
的clients
列表,有多少个建立连接就有多少个client。 现在卤煮不知道一个群成员发出消息后,服务端监听到消息要推给哪些client,是否可以和redis结合实现(不过也有几种设想)
- 消息中附带群成员
ID
,再去clients
过滤出频道中的client
- 打开chatroom时发送请求告诉服务端群
ID
,同样再去clients
过滤出频道中的client
- 消息中附带群成员
为了描述问题,作为制图小白还是画了“流程图”?
在线编辑
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
加一个消息队列,每个房间登记为一个 topic,登录的 client 订阅他加入的所有房间的 topic 。发送消息时往 topic 推一个广播。
client 监听到消息队列的新事件的时候,再进入 onMessage 流程下发给客户端。
该方案的客户端抽象模型:
架构示意图