万亿级数据洪峰下的分布式消息引擎

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 在首届阿里巴巴中间件峰会上,来自阿里的中间件架构师,Apache RocketMQ布道师冯嘉分享了《万亿级数据洪峰下的分布式消息引擎》。他主要从阿里消息引擎家族史、消息引擎面临的挑战,未来展望三个方面进行了分享。

在首届阿里巴巴中间件峰会上,来自阿里的中间件架构师,Apache RocketMQ布道师冯嘉分享了《万亿级数据洪峰下的分布式消息引擎》。他主要从阿里消息引擎家族史、消息引擎面临的挑战,未来展望三个方面进行了分享。在分享中,他从可用性&可靠性挑战、熔断机制、开源HA机制改进三个方面入手着重介绍了“双十一”在高可用方面面临的挑战以及阿里消息引擎在高可用方面的优化改进。

以下内容根据直播视频整理而成。

阿里消息引擎的今生前世


上图展示了从2007年开始阿里消息引擎的发展。消息引擎围绕着RocketMQ内核,在阿里内部有三大块:Notify解决事务消息,采用服务端push模型,用于交易核心消息分发;MetaQ用于有序消息,采用pull模型,可以解决海量消息堆积;Aliware MQ是RocketMQ商业版,支持公有云、金融云、私有云、聚石塔。


上图展示了服务端的分层架构,整个的Server架构是对VM友好的,在容器中可以轻量化的启动,最上层是授权和认证,codec针对协议编码(TCP层面),中间是限流和熔断,下面是缓存cache,Mix Storage可以支持混合存储。


Client端的分层架构也类似。不论是微服务还是RPC,都会面临Broker Discovery服务发现、keepAlive长连接保持、限流和熔断。

消息引擎的主要使用场景包括异构系统互操作、异步解耦、微服务、Backbone for EDA or CEP、数据复制同步、流计算。

万亿级数据洪峰下的挑战


上图展示了“双十一”期间交易、购物车、红包火山的情况。通过这个场景可以看出,在“双十一”当日,面临两大挑战:可用性和可靠性。

可用性


根据上图公式可知,如果平均故障恢复时间是1秒的话,那么可用性可以达到五个9,注意是一天的时间里奥。在消息引擎中,我们希望可用性能够做到:1.每秒支撑千万级消息发布;2.每条消息发布最大响应时间不超过20ms;3.每条消息发布平均响应时间不超过3ms。但是,实际的场景中难免会出现慢请求的情况。针对慢请求、长尾效应,阿里给出的解决方案是:低延迟存储,使用预分配+内存锁,读写分离,二次异步;限流、熔断,降级,秒级隔离;多副本高可用机制,Zab、Paxos/Raft,自动/手动切换,容灾演练。


上图描述了消息过来之后需要经历的四大块:首先经过Java堆,然后经过Lock(控制读写),然后PageCache通过刷盘策略把消息刷到Disk中。RocketMQ的整个存储是基于PageCache的文件存储,经过系统地分析延迟、毛刺造成的原因,可以得出内存分配与消息读写是整个存储引擎需要优化的瓶颈点。


RocketMQ在使用内存过程中会碰到很多产生Latency的场景。比如在分配内存时,当内存触及水位watermark_low,会触发kswapd后台回收,如果分配内存的速度大于后台回收的速度,内存会逐渐减少至水位watermark_min,同时触发直接回收。直接回收对于匿名内存非常快,但是对于Page Cache来说非常慢,因为需要把脏页刷到磁盘上再去回收掉。另一方面,在访存时,如果目标内存被swap out到磁盘上,此时需要先进行内存分配,如上所述该过程可能会产生Latency,内存分配完毕后需要进行swap in将数据Load到内存当中,该过程会涉及文件IO,也会产生一定的Latency。所以,内存的延时主要来自于访问(读写)的时候以及内存分配的时候。


整个消息只有直达到磁盘里才能算写成功,可以在Lock和PageCache之间加一个Direct Memory作为缓冲,这部分内存进行池化,避免在使用内存时产生Latency。相当于消息写到Direct Memory就会返回,整个消息的响应时间得到了极大的提升。

通过上述的优化,我们获得的经验包括:操作系统Page Cache Radix Tree自旋锁,会产生几秒的大毛刺;如果遇到坏盘,可能Block若干分钟,对系统产生致命影响。操作系统内存的每个Page的阻塞锁,产生几百毫秒小毛刺。将这些进行优化之后,写入数据平均响应时间不超过1ms,写入数据最大响应时间不超过20ms(Java GC暂停线程引起)。

熔断机制

在容量保证部分,即熔断机制。如果应用中第四块消息服务器出现问题,则会将其隔离出来,隔离规则是:1.最多只能隔离30%的机器;2.响应时间过长,开始隔离1分钟;3.调用抛异常隔离1分钟;4.如果隔离的服务器超过30%,则有部分调用会进入隔离列表中最早隔离的机器。

开源HA机制改进


Controller是其中一个非常重要的组件,需要实时监控主备的节点状态,内部保证了三机房部署。Broker启动的时候,它会将状态进行上报,controller则会在另外一个集群中写下主备状态,最后将主备状态同步到name server上。现在,HA大部分采用同步双写,通过状态机可以进行主从同步描述。刚启动一个机器的时候,如果没有发现别的master那么它就是master,然后通过异步状态对外提供服务。再来一台机器后,由于已经有了master,那么它会作为slaver,不断通过数据复制,从主到备,到达一定的阈值之后状态扭转成半同步状态,此时主和备之间的落差变得很小很小。最终,经过一段时间变成主备全部同步的状态。

LinuxOpenMessaging、ApacheRocketMQ展望

OpenMessaging


整个规范主要分为三大块:API层、线路层、高级特性和管理。上图列出了早期做消息规范需要涉及的内容。比如分布式事务,内部的话一直在用阿里的MateQ和Notify,这种分布式事务是发送者分布式事务,并没有解决发送、broker、consumer之间的分布式事务,所以在OpenMessaging中把整个的分布式事务规划进去。负载均衡也有很多的策略,比如基于时间退递的。分布式追踪主要考虑Linux CNCF中的opentracing。协议桥接主要是考虑如何和现有的规范进行桥接。在整个的消息中做一些流计算算子,在消息投递的过程中就可以把计算逻辑做进去。Benchmark主要用于把大家拉到同一起跑线做性能测试。


上图是整个RocketMQ的生态如图,下面是企业级的应用,上面是基于大数据产生的一些新的需求。

总结来说,下一代的消息引擎主要做四个方面的事情:电子商务,保证高并发;物联网领域,解决在线连接处理,即长连接;大数据领域,解决吞吐问题;金融领域,最重要的高可靠,多副本。

最后,打个小广告。阿里巴巴中间件消息团队招聘火热进行中。我们希望在分布式、大数据、多语言架构领域有较高造诣,有追求的同学加入我们。而团队将会提供非常有前景的发展空间,不定期地与世界顶级技术专家交流讨论,相信不想提高都难。有兴趣的请简历到我的邮箱: vongosling@apache.org。
相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
2月前
|
消息中间件 算法 Java
【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的保障容量的三大关键方案实现
尽管经过了上一篇文章 《【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的低延迟可用性机制方案实现》有了低延迟的优化保障,消息引擎仍需精心规划其容量。为了提供无与伦比的流畅体验,消息引擎必须实施有效的容量管理策略。
78 2
【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的保障容量的三大关键方案实现
|
2月前
|
存储 边缘计算 人工智能
云计算与分布式系统架构:驱动数字化时代的创新引擎
本文将探讨云计算与分布式系统架构在数字化时代中的重要性,介绍其基本概念和原理,并探讨其在推动技术创新、提升企业效率和满足用户需求方面的作用。同时,还将提出未来发展的趋势和挑战,为读者提供对云计算与分布式系统架构的深入理解。
|
2月前
|
消息中间件 存储 负载均衡
【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的HA高可用解决方案
昔之善战者,先为不可胜,以待敌之可胜。不可胜在己,可胜在敌。故善战者,能为不可胜,不能使敌之必可胜。故曰:胜可知,而不可为。
233 2
【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的HA高可用解决方案
|
2月前
|
存储 分布式计算 分布式数据库
【专栏】云计算与分布式系统架构在数字化时代的关键作用。云计算,凭借弹性、可扩展性和高可用性,提供便捷的计算环境
【4月更文挑战第27天】本文探讨了云计算与分布式系统架构在数字化时代的关键作用。云计算,凭借弹性、可扩展性和高可用性,提供便捷的计算环境;分布式系统架构则通过多计算机协同工作,实现任务并行和容错。两者相互依存,共同推动企业数字化转型、科技创新、公共服务升级及数字经济发展。虚拟化、分布式存储和计算、网络技术是其核心技术。未来,深化研究与应用这些技术将促进数字化时代的持续进步。
|
2月前
|
消息中间件 存储 Java
【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的低延迟可用性机制方案实现
在充满挑战的2023年度,我们不可避免地面对了一系列棘手的问题,例如响应速度缓慢、系统陷入雪崩状态、用户遭受不佳的体验以及交易量的下滑。这些问题的出现,严重影响了我们的业务运行和用户满意度,为了应对这些问题,我们所在团队进行了大量的研究和实践,提出了低延迟高可用的解决方案,并在分布式存储领域广泛应用。
60 2
【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的低延迟可用性机制方案实现
|
1月前
|
存储 搜索推荐 Java
微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门
微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门
36 2
|
2月前
|
存储 自然语言处理 搜索推荐
分布式搜索引擎ElasticSearch
Elasticsearch是一款强大的开源搜索引擎,用于快速搜索和数据分析。它在GitHub、电商搜索、百度搜索等场景中广泛应用。Elasticsearch是ELK(Elasticsearch、Logstash、Kibana)技术栈的核心,用于存储、搜索和分析数据。它基于Apache Lucene构建,提供分布式搜索能力。相比其他搜索引擎,如Solr,Elasticsearch更受欢迎。倒排索引是其高效搜索的关键,通过将词条与文档ID关联,实现快速模糊搜索,避免全表扫描。
156 6
|
2月前
|
存储 搜索推荐 Java
Java远程连接本地开源分布式搜索引擎ElasticSearch
Java远程连接本地开源分布式搜索引擎ElasticSearch
|
2月前
|
SQL 搜索推荐 数据库
分布式搜索引擎_学习笔记_3
分布式搜索引擎_学习笔记_3
25 1
|
2月前
|
SQL 分布式计算 Java
Note_Spark_Day08:Spark SQL(Dataset是什么、外部数据源、UDF定义和分布式SQL引擎)
Note_Spark_Day08:Spark SQL(Dataset是什么、外部数据源、UDF定义和分布式SQL引擎)
60 0