无限用户分发因群成员数量多、业务需求量大面临消息分发量激增、消息状态多样等多种挑战。
为了保证超级群在超大规模用户分发上的极致性能,融云超级群从设计阶段便综合考虑了服务部署模型、消息投递方式以及资源隔离等核心难题的解决方案。
本文主要分享融云超级群无限用户分发的架构设计和实施方案。
无限用户分发 面临的技术挑战
- 每个用户上行发送的每条消息,都需要实时分发给所有用户。即使目标用户不在线,也需要转成推送,触达这个用户。
无限用户可能过于抽象,我们以拥有 1000 万用户的一个群为例,一个用户发送的每条消息都会变成 1000 万的下行分发。在面对突发峰值,特别是群内有爆点消息或大规模成员被带起节奏的时候,数据的存储和网络的分发压力会急剧上升。
- 超级群内成员可能面对海量信息。无论是客户端的性能或者用户的心力,都是有瓶颈的。
成员量庞大的超级群会产生不同于普通聊天室的独特需求:用户希望既可以在有需要的时候不遗漏信息,又能在无关的时候不要被打扰。
所以,哪些消息、哪些场景需要推送,会话和消息以什么频率和聚合的方式通知到客户端,需要有一个巨大的可定制空间。
也就是说,作为一个通信平台,在海量信息和实时聊天之间,需要把能力抽象,并赋予 APP 弹性调整的能力。
- 由于超级群中的信息量太大,需要支持将群分割为不同的频道,类似传统的 topic 或 channel。即使相同的群和群成员,通过不同的频道,仍然能将会话、消息、未读数分门别类聚合。用户可以更关注自己感兴趣的部分,提升用户粘性。
- 将信息和聊天结合的场景,一般都有多端的需求。不同的平台,比如 Android、iOS、Web 等,在海量消息的网络请求和存储方面都有不同的技术特点,甚至同平台不同厂商的推送通道特性也不同,这些都需要一一考虑。
当然,无限用户群,还需要为每个用户提供全球的优质网络接入,保证客户端和服务器之间消息不重不丢不乱序。
在这方面,融云平台每天承载亿级用户和千亿的消息分发,已经提供了坚实的基础,无须特别考虑。
计架构和实施方案 服务分发分层架构
融云超级群从设计阶段便综合考虑了服务部署模型、消息投递方式、以及资源隔离等核心问题。
有限的扩散模型:
主节点负责核心校验,扩散节点则负责数据读写,保证主节点高可用和扩散节点分组内高可用,确保强数据一致性
优良的资源隔离:
支持公有云、专有云,分级的资源隔离,精准的流控策略
动态的投递模型:
根据群类型选择消息投递模型,多级消息缓存结构,在线状态联动,多种消息定向投递策略
存储和分发
对于底层存储而言,群成员无上限和有上限区别很大,有上限我们可以根据上限进行设计。
比如,普通群的消息,通常可以选择写扩散,可以在实时投递中获得比较好的速度和并发性。结合半写扩散(引用分发)的机制,可以在时间和空间上做一定的平衡。
但是超级群的场景,为了降低读写压力,默认采用读扩散的方式进行优化。原则上 1 写 N 读,通过上下行节点分离和一致性 hash 的特点,可以对读和写分别进行特定优化。针对热点数据引入内存级消息环和二级 LRU 缓存,保证读写性能。
分发模式
面对海量消息,用户希望既可以在有需要的时候不遗漏信息,又能在无关的时候不要被打扰。
对这些业务形态进行分析和实现,落到分发模型上,可以分为两大类。
一类是消息驱动型,比如 Telegram,一个用户实时接收所有会话的消息,会话状态、未读数、通知提醒其实都是由消息驱动的。
另一类是会话驱动,比如 Discord,用户有选择性地接收某些会话的消息,关注度低的会话,仅需要接收会话状态、未读数、@ 信息等通知就可以。和第一类结合起来,还可以做到订阅式的会话驱动。
分发机制决定了群的管理节点、会话节点、消息分发节点都必须是单独的高可用逻辑单元。
消息投递方式
用户不在线的情况下,超级群仍然支持给用户进行推送。但是,考虑到用户体验,APP 可以设置按时间聚合,或者仅推送 @ 等关联度较高的消息,也可以让用户自行选择,设置全局、群组级别、频道级别的免打扰,减少对用户的打扰。
用户在线的情况下,IM 长连接一般有直接推送、通知拉取、聚合通知等方式。超级群的消息和会话,会动态地结合这几种方式。协议层支持 QoS 并保证每条消息都有唯一值,客户端可以通过增量时间戳的方式,进行同步和补偿。
用户离线再上线的情况下,客户端会首先增量同步超级群会话信息,并通过会话和消息的 merge 和消息断档机制,同时保证消息的快速获取和信息的完备性。
部分操作内化
普通群场景下,大部分的状态、未读数、正在输入等会话信息,默认交给客户端进行处理,以保证灵活性。
但在超级群场景下,由于海量的历史消息和多端的特点,这些信息的存储和获取,需要内化在超级群的通信模型中。
针对消息的变更,融云超级群也提供了一系列扩展和内化的能力,比如消息发送时、发送后的扩展信息,并支持消息的撤回、删除、修改、引用修改等操作。
而针对 APP 常用的通知或者控制信令的场景,融云也提供在线消息等方式,保证在线用户的触达并降低分发量。
流控和资源隔离
因为超级群的模型非常灵活且峰值很高,作为一个通信平台,融云会在超级群的上行节点,提供 APP、群组、信令级别的流控,保证平台的稳定性,且支持专有云的单独调整。
通过以上方式,融云超级群得以在无限用户场景中保证消息传输的可靠性,不会出现消息丢失、消息延迟、消息乱序等问题;消息高并发情况下,用户不论是离线还是在线,都能有序接收推送或消息,不会出现卡顿,无法拉取等问题。同时,通过内化部分操作的方式减轻了客户端的性能压力。