关于IM系统服务端的一些疑问?
如图为简易的架构图:服务端(平台转发)使用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论