知识卡片
状态扩散的推拉分层策略:按实时性要求分层,而非一刀切
内容
用户上线这样一个简单的状态变更,在社交网络场景下会带来惊人的扩散规模——比如一个有100个好友、加入了10个群(每群100人)的用户上线,状态变更理论上需要通知1100人。如果对所有需要通知的对象都用同一种方式(比如统一主动推送)来同步,要么造成巨大的瞬时推送压力,要么因为批量处理而牺牲部分场景的实时性。IM系统的常见做法是按”这类关系对实时性的要求”把通知对象分成不同层次,采用不同的扩散策略:对好友关系(实时性要求很高,好友上线用户往往希望第一时间看到)采用主动推送模式;对群成员关系(实时性要求相对不高,群里某人上线不需要被每个成员立刻感知)采用被动拉取模式,等群成员下次有交互或查询时才获取最新状态。这个”推拉分层”的设计模式并不局限于IM场景,Feed流、微博等大扇出场景也普遍采用同样的思路——本质是承认”用统一的强实时性方式处理所有下游”在扇出规模大时代价过高,主动按下游对实时性的真实需求分层,把有限的实时推送能力优先分配给真正需要的场景,其余场景改用成本更低的被动获取。
参考来源
- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.4 从零开始搭建高可用IM系统"节,"2.4.1 什么是IM"(源文件:_epub-src/OEBPS/Text/Chapter2_4_2.xhtml)
- 结论依据:原文举例说明用户上线状态变更需要通知1100人的扩散规模问题,并给出"你的100个好友(实时性要求很高)采用推的模式,你的1000个群友采用拉的模式(实时性要求不高)"的解决方案,直接支撑本卡片结论。
- 原始内容:他的状态的变更需要通知1100个人,包括100个好友和1000个群友,这个扩散系数非常庞大……常见的做法和Feed、微博类似,你的100个好友(实时性要求很高)采用推的模式,你的1000个群友采用拉的模式(实时性要求不高)。