谙流 ASK 技术解析(二):高性能低延迟

谙流 ASK 是谙流团队自主研发的国产新一代云原生流平台,与 Apache Kafka 100% 协议兼容,全栈自主可控,专注私有化部署与行业场景赋能。

总体架构

  • Broker:ASK 计算引擎负责消息的转发,并对外提供服务。通过增加或删除 Broker 节点,实现计算层的扩缩容。Topic 是 ASK 对外提供服务的基本单位,通过对 Topic 进行分区,使不同的分区分配到整个 Broker 集群上,从而利用更多 Broker 的能力,最终实现了业务级的水平扩展。

  • Storage: ASK 存储引擎负责真正的数据持久化存储,采用分片存储模型,消息打散均匀分布到整个存储集群汇中。同时,支持秒级平滑扩容,实现存储层的水平扩展,并能处理海量消息积压。

  • Metadata:负责存储分片、Topic 等元数据信息,并且承担了一部分协调选主的功能,可以简单的将其理解为 ASK 集群的配置管理中心,压力比较小,一般不会成为集群的瓶颈点进而制约集群的水平扩展能力。

  • Produces: 支持连接复用、批量异步发送,还支持端到端压缩以减少网络数据传输,并提升性能。

  • Consumers: 基于分区的消费组模型,通过扩容分区实现业务级的水平扩展。

无锁模型

  • Reactor模型:基于 Netty 实现的 Reactor 模型,其包含一个网络线程池,负责处理网络请求,完成数据收发和编解码;业务逻辑处理则由一个业务线程池处理,充分利用现代系统的多核优势,极大地提高系统效率。

  • Broker无锁化:生产消费根据路由机制找到对应的Broker,Broker收到请求后按照 Topic 的分片参数,通过 Hash 算法绑定至固定线程,确保同一分片的数据处理逻辑在单一线程内完成,避免线程切换。同时,这种方式也隔离了任务分配,从而避免所有线程争抢请求任务,防止请求饥饿。

  • Storage无锁化:Producer/Consumer 向 Broker 发起消息读写网络请求,Broker 转发请求至 Storage 层,由 Storage 真正地对数据进行持久化存储。与 Broker 无锁化机制类似,Storage 基于分片 ID 通过哈希算法将请求分配至固定线程。ASK 采用顺序 I/O 模型,确保同一个磁盘的数据由专用 fsync 线程全局顺序写入。

基于无锁模型,固定线程的哈希映射,将全局竞争拆解为线程内串行;多级并行(线程/存储节点)充分压榨硬件性能,逼近物理极限,实现更强的性能和更稳定的延迟

读写IO隔离

**

**

影响性能的主要因素是副本复制的效率以及读写I/O的模型。

  • 并发副本写入:Apache Kafka 的 ISR 模型中,数据需先写入 Leader Broker,再由 Leader 通知 Follower 节点异步拉取,该模式的复制效率较低。尤其在数据可靠性要求高的场景下,Follower 副本的复制延迟会导致生产耗时显著增加。ASK 采用更高并发的模式,数据同时写入多个副本,只需满足预设的最小副本成功写入数即返回成功,这种机制大幅提升效率并降低延迟。

  • 独立写入IO:ASK 的 I/O 模型与 Apache Kafka 存在显著差异。为保障高性能与低延迟,其存储层分为两部分,一部分是 WAL(预写日志),写入流程中只要数据成功追加至 WAL 即视为副本持久化成功,WAL 采用追加顺序写,并通过组提交的方式,在性能和延迟平衡。同时基于 Ledger ID 哈希分盘,充分利用多块磁盘提升写入并发,最大化磁盘利用率。 WAL 仅需保留增量日志,主要用于故障恢复时重建一致性状态。因其高吞吐顺序写特性和滚动覆盖机制,实际占用存储极小,可部署于专用小容量磁盘。

  • 独立读取IO:另外一部分是 Ledger 数据,Ledger 数据存储采用异步持久化设计。数据写入内存即完成步骤 3 的响应,真正的数据存储在 Ledger 对应的磁盘。Ledger 数据不用像 WAL 一样,优先写入到内存中,根据设定的写入策略异步批量写入到磁盘(例如内存写满了则一次性刷盘)。由于混合分片写入,虽然保证了顺序写,但会带来随机读的情况,为了缓解随机读的问题,内存的数据会按照 ledger ID 进行排序,将相同 ledger 的数据尽最大放在一起,从而减少随机读。另外同 WAL 一样,基于 Ledger ID 哈希分盘,利用多块磁盘提升写入并发。

ASK 基于高效的副本异步批量确认机制 (满足最小副本即响应)和组提交压缩技术 ,大幅降低复制延迟;同时采用全局顺序写 I/O 模型,结合内存排序合并与磁盘组提交,最大化磁盘吞吐。此外,存储层分片分盘模型实现线性扩展,彻底规避 I/O 争抢瓶颈

多级缓存

存算分离架构下,消息读取需额外经过 Broker→Storage 的网络调用,为优化此开销,ASK 设计三级缓存:

  • Broker 内存缓存:Producer 消息成功写入后,Broker 将最新写入的数据存入 Cache 模块。为了减少 JVM GC 带来的影响,采用 Netty 的 Recycler 对象池技术进行高效的对象分配和回收,基于 LRU 对缓存的对象进行淘汰。对于追尾读(Tailing Reads)场景,Consumer 直接从该缓存读取(路径①),最大减少读请求穿透至存储层。

  • Storage 写缓存:当出现追赶读(Catch-up Reads)的场景(需要读取历史数据或消费跟不上生产),在 Broker 的 Cache 模块中找不到对应消息时,这时必须穿透到存储层获取数据。在 Storage 层设计了读缓存(Read Cache)和写缓存(Write Cache)。写缓存存放的是当前要刷入Ledger磁盘的数据。查询时,会优先在写缓存中查找消费者需要拉取的数据(路径②)。

  • Storage 读缓存:如果在写缓存中未命中,此时需要真正穿透磁盘去读取数据。ASK 没有重度依赖 Page Cache 技术,而是通过自定义缓存避免因为 Page Cache 换页抖动带来的不可控系统级别问题。为了减少 IO 读取的次数,会批量预读数据到读缓存,为其它消费组共享数据。

  • 分散读取:ASK 不会像 Apache Kafka 那样读写的主要压力都集中在 Leader Broker 上。在穿透存储层读取时,ASK 会对该分区的多副本进行分散读取,避免单点热点/ 避免热点集中在单个副本上。

ASK 采用三级缓存机制:Broker 内存拦截热点请求、Storage 内存缓存(Write/Read Cache)减少磁盘读 I/O,通过缓存分层最大化减少额外网络开销和磁盘读取的影响。

实际效果

以下是某客户实际生产环境的流量监控截图,QPS 达到千万级别,日均消息量达万亿级别,消息存储量接近 PB 级

可见 Storage 层写入吞吐量达到读取吞吐量的10 倍以上(实际峰值差距可能更大)。由于消费端资源限制未能扩展到最佳并发度,导致存在持续性消费延迟(表现为尾部延迟持续追赶)。

延迟表现保持稳定,P99 延迟控制在 15ms 以内 ,其中主流请求(约95%)的延迟集中在 6-8ms 区间。

结束语

谙流 ASK 以突破性的技术创新重新定义了高性能流处理的标准:

  • 架构革命 :通过 存算分离无锁模型多级缓存 三大核心设计,彻底解决了传统消息系统的性能瓶颈,实现百万级 TPS毫秒级延迟的极致体验。
  • 场景赋能支持秒级弹性扩缩容、PB 级消息积压、智能副本调度等企业级特性,满足金融、通信、物联网等行业对高并发、低延迟、强一致性的严苛需求。
相关推荐
武子康7 分钟前
大数据-266 实时数仓-Canal + Kafka 实现 MySQL 数据库变更实时捕获
大数据·后端·kafka
creator_Li7 分钟前
Kafka 全面技术笔记
笔记·学习·kafka
青春不流名2 小时前
kafka 集成OAUTHBEARER认证的例子
分布式·kafka
洛豳枭薰2 小时前
kafka重平衡导致的消息重复消费或者消息丢失
分布式·kafka
架构师老Y21 小时前
011、消息队列应用:RabbitMQ、Kafka与Celery
python·架构·kafka·rabbitmq·ruby
talen_hx2961 天前
《kafka核心源码解读》学习笔记 Day 02
笔记·学习·kafka
lifallen1 天前
如何保证 Kafka 的消息顺序性?
java·大数据·分布式·kafka
真实的菜1 天前
Kafka 2.x vs 3.x,我为什么选择升级?
kafka
时光追逐者1 天前
分享四款开源且实用的 Kafka 管理工具
分布式·kafka·开源
Rick19931 天前
rabbitmq, rocketmq, kafka这三种消息如何分别保住可靠性,顺序性,以及应用场景?
kafka·rabbitmq·rocketmq