关于IM系统服务端的一些疑问?

发布于 2022-09-06 12:51:15 字数 913 浏览 22 评论 0

简易架构图

如图为简易的架构图:服务端(平台转发)使用Netty框架接收不同客户端上来的信息,保存channel作为转发依据。消息放入RocketMQ,MQ得到消费信息转发给目标客户端。

疑问如下:
存疑1:MQ的Producer在产生消息时,若Consumer不在线,则在下次Consumer上线时,可以根据Topic获取消息。那么RocketMQ的push和pull应用场景该如何区分?

存疑2:接疑问1,既然MQ带储存功能,消费失败的都会再次消费,那是否可以每次有新的客户端上线,就新建一个Consumer?再用一个queue管理Consumer的生命周期随客户端的在线状态决定Consumer的存亡,这样做是不是违背了用MQ的初衷。后来看到一遍文档说Producer记录消息有时间限制,那如果超了时间还得存本地数据库?那我是不是可以直接让Producer不存消息,用Redis+MySQL来做消息缓存?最重要的是,Consumer内也无法知道转发的消息是否传达给客户端(判断客户端是否在线不一定消息必达,可能传输过程中丢包了。若在Netty转发的回调里面判断也是不成立的)。

存疑3:即使疑问2的模式可行,那转发失败的消息该如何被再次消费,此时的时序性该如何保持?(转发失败,但是Consumer已经消费了此消息,要放回Producer中,只能排在队尾)

存疑4:接疑问1:如果push为在线转发,转发失败则写入未读消息库,待下次上线时pull。那么当用户上线时,正好有一条消息push过来,但他还有未读消息,这时候如何保证未读消息在push消息之前显示(不一定未读消息先到达)。有一种方法就是客户端判断消息生成的时间戳,排序显示。但从现有产品来看。不存在已显示的消息上面多加一条消息的现象。

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文