IM 系统设计,关于服务端如何管理连接的 Clients 问题?

发布于 2022-09-13 00:26:11 字数 5084 浏览 31 评论 0

RT,问题概况:

  • 想做一个类似聊天室的APP,属于没有太多经验正在探索中,看了一些文章没有读太懂,比如我觉得读扩散(Pull)模式适合我,但不懂里面说的发件箱和数据库的表是什么关系。
  • 数据库用的MongoDB,存储消息建了两个表send_message(主要储存消息内容)、 received_message(主要储存消息相关ID)
  • 用户建立连接会在URL带一个UserId,因为WebSocket.Server服务端使用的是ws,所以最终可以拿到带有UserIdclients列表,有多少个建立连接就有多少个client。
  • 现在卤煮不知道一个群成员发出消息后,服务端监听到消息要推给哪些client,是否可以和redis结合实现(不过也有几种设想)

    1. 消息中附带群成员ID,再去clients过滤出频道中的client
    2. 打开chatroom时发送请求告诉服务端群ID,同样再去clients过滤出频道中的client

为了描述问题,作为制图小白还是画了“流程图”?

在线编辑

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

野鹿林 2022-09-20 00:26:11

加一个消息队列,每个房间登记为一个 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)
})

该方案的客户端抽象模型:

image.png

架构示意图

image.png

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文