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

Zhan
  • 17

简易架构图

如图为简易的架构图:服务端(平台转发)使用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消息之前显示(不一定未读消息先到达)。有一种方法就是客户端判断消息生成的时间戳,排序显示。但从现有产品来看。不存在已显示的消息上面多加一条消息的现象。

回复
阅读 1.7k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏