# 《分布式IM系统》大后端平台-消息服务-第02节:群聊消息的发送流程设计和实现

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)
课程视频:https://t.zsxq.com/17FYku2x8 (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本节难度:★★☆☆☆
  • 本节重点:对群聊消息的流程进行设计和实现,从源码级别掌握群聊消息的发送流程,掌握基于可靠消息最终一致性分布式事务解决方案,理解群聊消息在整个分布式IM即时通讯系统中的流转过程,结合自身实际项目思考,将本节学到的知识灵活应用到自身实际项目中。
  • 课程视频:https://t.zsxq.com/17FYku2x8 (opens new window)

大家好,我是冰河~~

消息微服务主要承担着大后端平台的消息收发与消息流转,无论用户是发送单聊消息,还是发送群聊消息,都会通过大后端平台发送消息,发送的消息经过在大后端平台的一系列流转,最终会通过消息微服务整合的即时通讯SDK将消息发送到即时通讯后端服务,再由即时通讯后端服务将消息推送到用户的终端设备。

# 一、前言

在前面的文章中,我们已经对大后端平台的消息微服务实现了单聊的流程,如果需要基于消息微服务发送单聊消息,只需要调用消息微服务的接口即可,无需过多的关注发送消息的细节流程。并且其他业务系统如果想对接分布式IM即时通讯系统实现单聊和群聊消息的发送与接收,只需要对接即时通讯SDK即可,同样无需过多的关注消息的收发细节流程。

# 二、本节诉求

对分布式IM即时通讯系统中大后端平台的消息微服务发送群聊消息的流程进行设计和实现,从源码级别实现消息的发送和流转流程,保证消息发送和消息持久化的一致性,掌握基于可靠消息最终一致性的分布式事务解决方案,理解群聊消息在整个分布式IM即时通讯系统中的流转过程,结合自身实际项目思考,将本节学到的知识灵活应用到自身实际项目中。

# 三、群聊流程

在前面的文章中,我们对群聊消息的发送流程进行了梳理和总结,为了让大家能够更好的结合代码来理解群聊消息的流转流程,这里我们再将群聊消息的交互链路图放出来,群聊消息的整体交互链路如图2-1所示。


群聊就是在分布式IM即时通讯系统中,多个用户在同一个群组中进行聊天,此时在发送消息时,我们可以通过群组ID找出群内所有在线的用户,将消息即时发送给在线的用户。那些未在线的用户就按照单聊未在线的用户进行处理,大致交互链路如下所示。

(1)用户调用后端平台的接口向群组发送消息。

(2)后端平台将消息缓存并写入消息库。

(3)由于是向群组发送消息,群里有多个用户,此时就会从Redis中获取所有用户连接的IM即时通讯服务ID列表。

(4)对用户按照服务ID分组,将相同服务ID下的用户分在同一个逻辑分组里,方便后续推送消息,并且会记录未在线的用户列表。

(5)循环向每个服务ID对应的RocketMQ中的Topic发送消息。

(6)广播处理未在线用户的未读消息ID。

(7)IM即时通讯服务会监听自身服务ID对应的Topic,会随时接收推送到自身服务的消息。

(8)当IM即时通讯服务接收到消息后,此时用户掉线,或者用户不在线,向用户推送消息就会失败,或者未查询到用户与IM即时通讯服务建立的连接,就不会向用户推送消息。

(9)当用户登录分布式IM即时通讯系统后,会从后端平台拉取历史(离线)消息,并通过用户在线的流程,向用户推送消息。

备注:关于群聊消息的交互链路更多细节内容,大家可以阅读《需求设计-第04节:分布式IM即时通讯系统技术流程梳理 (opens new window)》一文。并且在保存群聊消息与调用即时同村SDK发送群聊消息时,我们使用了基于消息最终一致性分布式事务解决方案来解决分布式事务问题。有关基于消息最终一致性分布式事务解决方案的内容,大家可以阅读《Seckill秒杀系统》专栏的《第51章:基于可靠消息最终一致性模型解决分布式事务问题 (opens new window)》一文。

# 四、编码实现

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码