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
- 消息中附带群成员
为了描述问题,作为制图小白还是画了“流程图”?
在线编辑
回答:
加一个消息队列,每个房间登记为一个 topic,登录的 client 订阅他加入的所有房间的 topic 。发送消息时往 topic 推一个广播。
client 监听到消息队列的新事件的时候,再进入 onMessage 流程下发给客户端。
// 伪代码onSend(function(msg){
save(msg); // 持久化消息
if (msg.type == GroupMessage) {
exchange.publish(`topic-${msg.room_id}`, msg);
}
})
exchange.subscribe('topic-room-id', queue, function(msg) {
client.onMessage(msg)
})
该方案的客户端抽象模型:
架构示意图
以上是 IM 系统设计,关于服务端如何管理连接的 Clients 问题? 的全部内容, 来源链接: utcz.com/p/196583.html