快手 RocketMQ 高性能实践

本文作者:黄理,快手在线音讯体系负责人。

快手关于 RocketMQ 社区版别的优化一般为在其外层进行才能的构建,而不是对其内部进行大改动,因为内部大改不利于后期的版别晋级。即使对内部 RocketMQ 进行了修正,咱们也会尽量通过 PR 将新特性回馈到社区。

快手会守时对 RocketMQ 进行晋级。2022年新年,咱们斗胆运用了没有正式发布的 RocketMQ 4.9.3-SNAPSHOT 版别,平稳度过了快手一年中最重要的活动,这也证明了社区版别 RocketMQ 的兼容性和稳定性。

运用篇

快手 RocketMQ 高性能实践

RocketMQ 进入快手两年内,从 0 发展到每天数千亿音讯级别。快手是 RocketMQ 社区版别的事务音讯最早的大规模用户,现在每天有百亿以上的事务音讯和守时音讯,完成了跨 IDC的主动负载均衡以及容灾,完成了多级泳道(项目)互不搅扰,多个项目可一同开发,以及可回落。

快手 RocketMQ 高性能实践

RocketMQ的落地办法一般为两种。

办法一:在开源软件的基础上进行修正,可以快速轻松地完成需求的功用,但后续晋级存在很大不便。

办法二:对RocketMQ的 client 和 server 只进行少数修正。假如 server 存在才能缺失,会开发辅佐的 server 或以 proxy 进行补充。咱们在 client 之上包装了一层 MQ SDK,对用户屏蔽了具体完成。快手也是根据此办法对RocketMQ进行了落地。

快手 RocketMQ 高性能实践

MQ SDK如上图,分为三层:最上层为 API ,用户与该层打交道;中心为核心层,可以完成各种通用的才能;最底层负责与具体的 MQ 交互,当时只要 RocketMQ 的完成,但未来也许会有其他音讯中心件的完成。

中心层完成了热改变的才能。用户装备不写在代码里,而是在渠道进行指定,指定今后热收效,SDK 会直接加载新的装备并主动 reload 用户程序,无需重启。

快手 RocketMQ 高性能实践

RocketMQ 会分配 Logic topic,事务代码无需关怀集群在哪,无需关怀当时环境,也无需关怀数据标记比方压测、泳道,只需运用咱们供给的非常简略的 API ,杂乱的进程全部在核心层进行封装,对事务用户屏蔽。

快手 RocketMQ 高性能实践

上图为跨机房负载均衡的完成流程。

一切Logic topic 都会映射到上图中心的两个机房,每个机房部署一个集群。RocketMQ 集群可以有多个 broker ,出产者和顾客对 broker 有毛病感知和转移才能,可以通过 NameServer 发现哪个 broker 毛病以防止与其进行衔接。为了完成更好的控制,咱们在集群之上又封装了一层负载均衡,并在 client 端完成。

每一个 Logic topic 都被分配到两个集群,出产者在出产时会一同衔接到两个集群。两个集群别离位于不同 IDC,同一地区的两个IDC之间延时大约为1-2ms。顾客侧也是双连,一旦某机房或集群产生毛病,流量会立刻主动转移到另一机房。

咱们将出产端的主动负载均衡(主动failover)进行了抽象封装,做成了开源项目。Failover 组件与 RocketMQ 无关,在主调方做 RPC 或音讯出产等调用时,会检查被调方的健康度。假如被调方不健康或响应很慢,则会调低其权重。

扫描上方二维码,了解更多关于该组件的功用。

快手 RocketMQ 高性能实践

RocketMQ 完成了简略的推迟音讯,可是只能完成几个固定级别的延时,而实践的事务更期望发音讯时可以恣意指定推迟时间。因而咱们通过外挂 Delay Server 的办法完成了恣意精度的推迟音讯。

Delay Server 会将用户要求推迟投递的音讯进行保存,比及指守时间今后,再将音讯送回原来的事务 topic 。

快手 RocketMQ 高性能实践

根据PULL的形式(RocketMQ的PUSH Consumer也是根据PULL),很难直接完成动态的多泳道阻隔。因而很多公司会挑选根据泳道的不同将音讯投递到不同的 topic,这样虽然完成了功用,可是侵入性太强,而且也不好完成多级回落。

而在快手,咱们将一切泳道的消费都放在同一个 topic 里,而且完成了多级泳道回落。比方项目 A 和项目 B 一同在开发,项目 A 出产的音讯由项目 A 的顾客消费。项目 A 下面有子项目A.X和A.Y,那么A.X出产的音讯由A.X的顾客消费,可是假如A.Y没有顾客,因而A.Y出产的音讯会回落到由 A 的顾客进行消费。

快手 RocketMQ 高性能实践

快手的泳道阻隔主要通过 RPC 转发完成。

如上图,黄色线代表项目 A 的数据流向,橙色线代表项目 B 的数据流向。SDK 会在将数据交给事务用户之前,先检查数据的泳道标记是否匹配,假如不匹配,则会通过 RPC 的办法转发至匹配的顾客。

这样咱们等于是将 PULL 转为了 PUSH,在主调方进行挑选,所以可以将一切项目放在同一个 topic 里,且可以完成阻隔。

快手 RocketMQ 高性能实践

RocketMQ 是根据 queue 来进行客户端的 rebanance,假如顾客的数量大于queue,则会导致部分顾客无事可做;或有时 queue 分配不均匀,导致部分顾客负担大、部分顾客负担小。

咱们通过RPC的办法完成了消费 Proxy,先从 RocketMQ 的 broker 消费数据,再通过 RPC 的办法 PUSH 到 consumer。

消费 proxy 的 RPC 与前文的 RPC 转发运用同一套机制,因而RocketMQ 不需求过多的 queue, 但可以有很多顾客。消费 proxy 为可选项,只需在渠道指定消费办法,无需修正代码也无需重启,即可直接热收效。

快手 RocketMQ 高性能实践

此外,咱们开发了拨测程序,生成了一个模拟的出产者和顾客。出产者会往线上一切集群的每一个 broker 发送音讯,包含普通音讯、守时音讯和事务音讯。顾客消费到音讯后,会取出音讯体内出产者的 IP 地址,然后通过 TCP 的办法 ACK 回出产者,奉告出产者音讯是否丢失、是否重复以及从出产到消费的推迟是多少。

别的,还可以针对出产者和顾客进行各种装备,比方音讯体巨细、出产速率、对账抽样比例、对账周期等。比方在装备中将速率调大,即可完成压测,出产者和顾客会进行打点,最终可在 Grafana 上进行检查和告警。

功能篇

对 RocketMQ 进行功能优化后,300字节小音讯出产 TPS 提高54%,一同 CPU占用降低11%;600 queue消费功能提高200%,跨IDC 100KB大音讯单线程出产 TPS 提高693%,跨IDC 100KB集群消费吞吐提高250%。

优化主要分为两批。

快手 RocketMQ 高性能实践

第一批优化会集在RocketMQ4.9.1版别,包含清除剩余的日志、消除不必要的锁、消除主从复制中的数组拷贝、优化Broker的默认参数、优化锁内操作的功能并将部分操作抽取到锁外、优化音讯属性编解码的功能以及优化音讯Header解析的功能。扫描二维码可阅览本次优化相关的完好文章。

别的,RocketMQ 4.9.0版别的默认参数设置不合理,因而咱们在4.9.1版别对其进行了优化,使得功能有了巨大提高。

快手 RocketMQ 高性能实践

上图为第二批优化的方针:

  • 降低 CPU 开支。RocketMQ 不耗费 CPU,可是在混合部署场景下,CPU 极有可能会成为问题,因而需求对 CPU 开支进行优化。

  • 提高跨机房的出产、消费的吞吐。

  • 提高大音讯的吞吐。

  • 提高queue特别多的场景下的消费功能。

第二批优化大部分会集在社区的ISSUE3585 里,扫描上方二维码可阅览完好文章。

快手 RocketMQ 高性能实践

上图为第二批优化CPU 方面的具体内容,字母编号与 ISSUE3585 相对应。此前RocketMQ 运用 Fastjson 做序列化,而有一个自定义的协议功能稍微优于 Fastjson,咱们对其进行了深入研究和优化,最终使得 RocketMQ 在编解码上功能也得到了很大提高。

快手 RocketMQ 高性能实践

RocketMQ 构建 Queue 的程序为单线程,因而咱们运用mmap buffer 替代 FileChannel,功能得到了极大提高。

上图红框中为某办法优化前后比照。

快手 RocketMQ 高性能实践

此外,咱们将 Pull 通知移动到别的的线程,使其不占用线程的资源。一同,将通知主动聚批,统筹高吞吐和低推迟,只要 TPS 较高时才会主动打开,阈值可设置,防止 Pull 通知在 Broker 和顾客之间震荡频率过高,耗费 CPU。

快手 RocketMQ 高性能实践

大音讯功能不佳也是一直以来很大的困扰,通过剖析咱们发现 RocketMQ remoting 的 TCP 参数设置有待优化。原先的buffer 设置为固定值,当机房推迟很大时,过小的 buffer 会导致 TCP 衔接的吞吐受到严重影响。因而,咱们将 buffer 修正为由操作体系主动办理,以保证吞吐。

上图列出了线上实测的数据表,可以看出消费的功能提高了数倍。

快手 RocketMQ 高性能实践

在极高的 TPS 场景下,假如音讯体较大,则操作体系内存分配可能会成为 RocketMQ 的瓶颈,4.X 的内核下的体现远远优于 3 .X 。极点场景下,3.X内核一般需求将参数 min_free_kbytes 调至较大值。

快手 RocketMQ 高性能实践

咱们于2021年12月社区开发者会议现场演示了功能测验,比照了第二批优化前后的4.9.2版别和4.9.3 Snapshot版别(包含当时还未合并进该版别的B和K的优化)的功能。

测验时,在电脑上一同运行一切 broker、出产者、顾客。老版别TPS不到 3w,而新版别有了主动聚批的才能,TPS 可达 6 w,相比于老版别提高了一倍。

参加 Apache RocketMQ 社区

十年铸剑,Apache RocketMQ 的生长离不开全球接近 500 位开发者的积极参加奉献,信任在下个版别你便是 Apache RocketMQ 的奉献者,在社区不只可以结识社区大牛,提高技术水平,也可以提高个人影响力,促进本身生长。

社区 5.0 版别正在进行着如火如荼的开发,别的还有接近 30 个 SIG(兴趣小组)等你加​入,欢迎立志打造世界级分布式体系的同学参加社区,添加社区开发者微信:rocketmq666 即可进群,参加奉献,打造下一代音讯、事情、流融合处理渠道。

快手 RocketMQ 高性能实践

微信扫码添加小火箭进群

别的还可以参加钉钉群与 RocketMQ 爱好者一同广泛讨论:

快手 RocketMQ 高性能实践

钉钉扫码加群

关注「Apache RocketMQ」大众号,获取更多技术干货