前面我们分析了 “点对点消息” 的实现逻辑(《分层架构 IM 系统之消息收发功能设计与实现》),今天分析 IM 群消息逻辑。
在之前的文章(《基于需求分析模型来结构化剖析 IM 系统》)中分析过,“私信消息” 即点对点消息属于【基础功能需求】,“群消息” 属于【扩展功能需求】, “群消息” 功能是基于 “私信消息” 进行实现的,当 “私信消息” 功能完成后,实现 “群消息” 则轻而易举!
我们先分析 “群消息” 的领域模型,再分析其逻辑流程。
一、群消息领域模型
领域模型是对现实世界中对象的可视化表示;群消息是 IM 系统的一个问题领域,其模型可以通过 “关系表” 非常直观的进行表达。
群消息的领域模型包括 “群消息” 和 “群联系人”,其设计理念在之前的一篇文章(《分层架构 IM 系统之 Das 领域模型设计》)中曾深入分析过。
1、群消息
群消息关系表在设计时,需要重点考虑两个因素:一是消息定制化,二是分表存储。
先说群消息的定制化:假设张三和李四都在群里,当群里有人发出一条消息时,如果张三将这条消息删除了,并不表示其他群成员就看不到这条消息了;如果李四将这条消息点赞了,也并不表示其他群成员都点赞了该条消息。这就是群消息的定制化,虽然站在群的角度看,这是一条消息,但站在每个群成员的角度看,消息就不是一条了,它是跟每个群成员绑定的。
再说分表存储:每一个用户可能有很多的群,每一个群可能有非常多的群消息;当群消息总的数量非常大的时候,我们往往会对其进行分表处理。这个时候就需要考虑一个关键问题了:每一个用户的所有群的所有的消息都应该落在一张表中,避免在查询时对所有的表进行遍历。
基于上述两个因素的考虑,对群消息关系表设计如下: