默认
打赏 发表评论 29
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
引用:65725738 发表于 2018-11-03 10:53
好文章,写的很深呀!
有几个问题请教一下。
1:你说贵公司tcp的系统瘫痪换udp了。请问是为什么呢。tcp显 ...

逐个回答你的问题。

1 关于到底用tcp还是udp,这个话题跟你们公司相关基础设施建设有关。
2 文中 Client 一词你得根据上下文理解,所有图中的 Client 指的是服务端的消息发布者,并不是 APP 类型的客户端,所以不存着 gateway和proxy合并的事情。

3 你得理解“room message复制多份 仅仅是相当于room message增加。room message增加不是仅仅需要扩容proxy 和  broker吗?”非常且完全正确,Router扩容是登录消息量增大的时候才进行扩容,如果文中有相关字句造成你理解为“room message复制多份需要扩容router”,请指出,我可以修改。至于Router扩容方案你没怎么理解,具体哪一步不理解,可以在Jack Jiang的群里私下找我沟通。

4 至于各个组件怎么通信,我个人觉得blog已经详细说明了,有错误地方或者不明晰的地方可以直接在Jack群里找我沟通。
评论 29
引用:coding_im 发表于 2018-12-07 18:56
请教几个问题。
1. 用户发的消息怎么进入系统,我看里面的client并不是指用户?  用户与gateway保持长连 ...

这个消息系统仅仅是一个消息下发通道,可类比为一种pubsub型的mq,如果下发消息是群消息,则这个系统根据群ID就能把消息准确的扩散复制后下发给群里每个相关成员的客户端,如果消息消息是单聊消息,则这个系统根据消息中的UID就能准确地把消息下发给这个UID的客户端。

下面逐个回答你的问题:
1 这里的client其实是服务器其他模块对这个系统的调用者,套用mq中的术语,其为producer。用户与gateway之间确实保持长连接,这个连接其实是用于上传客户端发送出的消息,也用于接收别的客户端发送来的消息,但是这套系统重点讲解的是如何对消息进行下发,所以本文只讲了如何对消息进行扩散、寻路(路由)和下发。

2 如果一个 RoomID 的所有客户端都连接一个 Gateway,则你说的这个问题确实存在。但是,这里的问题是如何避免这种情况发生,而不是把问题抛给消息系统,把压力传递给消息系统让消息系统去解决这个问题。譬如,我们在Gateway前再加一个 httpDNS 系统,当客户端寻找要连接的 Gateway 的时候,由 httpDNS 系统确保所有的客户端连接均匀地被打散到各个 Gateway,同时限制每个 Gateway 的连接数目不会超过最大 Room 内成员额定数【譬如最大 QQ 群是2000人,则确保每个 Gateway 的连接数低于 2000】,这个问题估计就不是个问题了?

上面是个人的愚见,还有需要指教的地方,可以继续回帖。

点评

JackJiang  说:
yuyu是本文《一套高可用、易伸缩、高并发的IM群聊架构方案设计实践》的作者,专门请他来回复的,以他的回答为准,大家可以多讨论  (5 年前)
引用:一夕 发表于 2019-03-01 16:06
有一点不是很明白:
1.是不是写扩散点逻辑在最后的方案中是放在【Relay】中。
2.【Route】和【Relay】的 ...

逐个回复你的问题。
1 写扩散点最后确实是在 Relay。
2 以系统最后一个版本为例,Router 是向系统的 Broker  转发群内每个在线用户的在线信息【Gateway Message】,向 Relay 转发每个在线用户所在的 Gateway信息【Relay Message】。Router向Relay发送消息,Relay不会向Router发送消息,只会向 Gateway 发送群聊消息【Room Message】和单聊消息【Chat Message】。

或许举例一个实际场景能够更让人清晰明了。譬如有如下场景:

A: Room1 【RoomID: 100】内有用户 U1【UID:1001】、U2【UID:1002】和 U3【UID:1003】;
B:U1 登录了 Gateway1【G1】,Gateway1 的地址为 10.0.0.1:10000;
C:U2 登录了 Gateway2【G2】,Gateway2 的地址为 10.0.0.2:10000;
D:U3 不在线。

则 一条Gateway Message 包含的数据关系就是:map{key: Room1-100,value: User List[U1-1001,U2-1002]};

Relay Message有两条,其数据关系分别是 map{key: U1-1001, value: G1-10.0.0.1:10000} 和  map{key: U2-1002, value: G2-10.0.0.2:10000} ;

Room Message 就是一条包含 Room1-100 的消息;

Chat Message 就是两条分别包含 U1-1001 和 U2-1002的消息。

3 本系统其实讲了两个模型的系统:第九章内容讲解的最新版本的实时在线消息下发系统以及第八章内容讲述的异步离线消息下发系统,前者是使用推技术把消息【推送】给客户端,后者则是依赖客户端自身的状态把消息【拉取】下来。

离线消息系统中并没有 Relay 模块,只实现了群聊消息的异步下发,所以请明晰概念后再进一步讨论。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部