融云首度披露高并发系统架构设计四大要点

5G因高速率、大容量和低时延三个主要特征,为我们带来了无限遐想,但如果底层通信能力及设计架构不足以支撑高并发的场景,高延时仍然不可避免,那么5G技术所赋予的全新应用体验也将大打折扣,因此,掌握高并发的通信技术在5G时代至关重要。

在2019全球互联网通信云(WIIC)大会上,融云技术总监高晓光在“架构演进与性能优化”论坛演讲中毫无保留地分享了融云高并发通信技术的系统设计与实践,希望给广大开发者提供一些实战帮助。作为通信云行业的技术领导者,融云连续五年保持IM即时通讯市场占有率第一,是业内唯一承诺在高并发和弱网环境下,仍然可以保障消息不丢、不重、不乱序的厂商,融云的高并发通信技术和系统架构也已成为业界争相学习的技术标杆。

融云技术总监高晓光演讲

高并发系统的设计要点

WICC会上,高晓光首先分享了融云在整个通信平台上常用的系统性能优化手段。在系统运行的性能上,融云主要关注业务、系统和存储三个层面的问题。在业务层面,建议开发者关注每个业务请求接口的响应时长,动态掌握正确的响应时长,过长和过短都不合理,并对程序运行中的性能拐点,尽可能的优化,延长其到来的时间,这可极大提升高并发的业务承载能力。在系统层面,程序运行过程中关注CPU、内存和I/O这三方面的使用情况,合理配置资源;在存储层面,根据实际业务场景做数据库选型,选择合适的存储介质。

基于以上性能问题关注点,高晓光坦言融云高并发系统的设计要点主要集中在以下四个方面:

融云高并发系统的设计要点

采用异步化的请求处理。目前,融云采用基于Actor模型自研的分布式RPC框架来实现整个通信云平台,不但可以把请求的源数据,像流水线一样在每个节点处理完后直接下转,还可以将最终处理的结果通过溯源直接投递回去,从而减少数据的调用次数。相对于同步的方式,异步化可以提高资源的复用程度,中间需要被处理的节点越多,异步化的优势会越明显。

合理的缓存策略。通过数据、分布式缓存、本地缓存、客户端缓存层层递进的缓存策略,使越活跃的数据越逼近客户。目的在于让热的数据离它要处理的位置更近,以提高缓存的利用率,加快数据处理的速度。

选用适合的数据结构与算法,可以极大的提高整个程序的计算性能。例如一致性哈希算法,可用于整个服务的数据的散列,或者节点的定位;LRU缓存,一个带数据淘汰的缓存组件,把冷的数据淘汰掉,把位置腾给热的数据,提高数据利用率;BitMap,每一个比特位都可用来标识一个状态位,可用于快速的状态判断和节省存储空间;Bloom Filter可以认为是BitMap的一种应用,可以用来快速判定数据是否存在,避免缓存穿透。

高效的数据存取模型。在融云整个系统里面会常用到几种不同的存储类型,没有高下之分,高晓光说选用的原则是一定要符合业务场景。例如,存用户的在线和离线状态,融云会选用KV存储;存储消息,由于消息对于时序的要求很高,所以可以选择时序型数据库。数据怎么用起来方便,就怎么去存取它。

高并发系统架构的最佳实践解读

WICC上,高晓光谈到消息分发的典型场景有单聊、群聊、聊天室,不同场景应具体分析、分别应对,才是解决高并发问题的秘诀。会上特别针对群聊和聊天室的不同特点,融云分享了不同的最佳实践方案。

针对群聊场景。首先,融云在系统中使用消息分发控制策略,在群消息分发中引进快、中、慢三个队列,分别设置不同的延时值,根据不同的群成员数量,映射到不同处理队列中,将绝大多数百人以下的群放入快速队列,进行快速处理,可极大地减轻分发的压力。

其次,融云采用消息直推与通知拉取相结合的方式,在消息不频繁时用直推模式,当消息量爆增,产生积压时即转为通知拉取模式。同时,使用 ACK 机制进行消息可靠同步,且同步的消息严格按照时间戳有序进行,这个时间戳由服务端保证唯一性,这也是融云敢于承诺消息不重不丢不乱序的秘籍所在。

再则,融云通过“引用分发”机制降低消息缓存的存储占用。原则上,是按消息大小及群成员数量来判定是否采用“引用分发”。当消息体大,如发送语音或图片时,就采用“引用分发”机制,只分发一个索引,当终端实际拉取消息时,再推送实体消息。

针对聊天室场景。聊天室和群聊的不同之处在于:聊天室的成员关系是临时性的,出入频繁,若遇大型直播,成员瞬时可达几万甚至几十万,消息极其活跃,瞬时峰值极高。融云承诺的是成员无上限的聊天室服务,最高服务过15万人同时在线,每秒消息的分发量超过2000万条,日消息峰值超2218亿条。

为满足高并发消息的服务请求,融云部署了环形队列的内存缓存,滚动保存最近的50条消息。在终端完全改用通知拉取的方式,用户收到通知后,可从服务端的缓存中获取消息,这起到了很好的限流作用,直接缓解了终端压力。

另外,对于聊天室而言,融云根据多年服务客户的经验以及自身的技术模型,制定了一套按消息类型进行消息抛弃的处理机制。例如大型直播的场景,消息可能频繁到每秒瞬间几万条消息涌向终端,即便终端能够处理过来,用户也未必看得过来,体验反而很差。所以当直播间消息量过大或消息频率过高时,融云会为消息设置优先级,并将连续消息和相似消息优化成一条“叠加消息”,同时根据优先级机制抛弃无用户属性消息,确保消息并发量极大的情况下,用户端也可以享受流畅的直播互动体验。对于聊天室,融云还额外对消息上行进行限流,也有效提升了用户体验。

未来所面临的挑战和改进

随着5G+物联网时代的到来,各种终端设备甚至会延伸到触手可及的任意一物,海量消息激增将直接导致高并发的场景无处不在,底层的通信系统架构也将面临难于想象的考验。

高晓光表示,融云一直以来在服务性能上都围绕着三大重心去进行优化,一、合理的算法,降低CPU使用;二、合理的内存结构,降低内存用量,提高缓存利用率;三、尽可能的降低I/O的频次。同时,高晓光在演讲中还着重强调:任何的优化都需要符合特定的场景,如果没有场景,任何优化都毫无意义。

回顾前文,融云的云通信系统架构之所以能够经受住各种高并发的极端考验,与融云正确分析场景的特点,进而采取有效对策密切相关。此次融云在WICC上的技术分享,希望帮助开发者了解到,在单群聊及聊天室这样典型的消息分发场景下,通信云技术如何对高并发业务进行支撑。通过高并发系统设计及最佳实践的解读,融云希望引领业界技术领袖一起,持续推动通信云技术对5G多应用场景的服务性能优化与提升。