AutoMQ vs Kafka: 来自小红书的独立深度评测与对比

测试背景

当前小红书消息引擎团队与 AutoMQ 团队正在深度合作,共同推动社区建设,探索云原生消息引擎的前沿技术。本文基于 OpenMessaging 框架,对 AutoMQ 进行了全面测评。欢迎大家参与社区并分享测评体验。

01

测试结论

本文主要测评云原生消息引擎 AutoMQ 和 Apache Kafka(3.4 版本)的性能对比。

测试结论:

  • 实时读写:相同集群规模,AutoMQ 的极限读写吞吐是 Apache Kafka 的3倍,E2E 延迟是 Apache Kafka 的 1/13

  • 追赶读:相同集群规模,AutoMQ 的追赶读峰值是 Apache Kafka 的 2 倍,同时追赶读期间 AutoMQ 的写吞吐和延迟不受任何影响

  • 分区迁移:AutoMQ 的分区迁移平均耗时为秒级别,而Apache Kafka分区迁移平均耗时为分钟甚至小时级

02

测试配置

基准测试在 Linux Foundation's OpenMessaging Benchmark 的基础上进行增强,模拟真实用户场景提供了动态工作负载。

2.1 配置参数

AutoMQ 默认数据强刷盘再响应,使用配置如下:


acks=all
flush.message=1

AutoMQ 通过 EBS 底层的多副本机制来保障数据高可靠,在 Kafka 侧无需多副本配置。Apache Kafka 选择 3.4.0 版本,并参考 Confluent 的建议不设置 flush.message = 1,使用三副本内存异步刷盘来保障数据的可靠性(机房掉电故障会造成数据丢失),配置如下:


acks=all
replicationFactor=3
min.insync.replicas=2

2.2 机器规格

16c、最大网络带宽 800MB/S、配置一块 150MB/S 带宽的云盘

03

详细对比

3.1 实时读写性能对比

本测试测量 AutoMQ 和 Apache Kafka 在相同集群规模下,不同流量规模的的性能和吞吐上限。测试场景如下:

  1. 各自部署6台数据节点,创建 1 个 100 分区的 Topic

  2. 分别启动 100 MiB/s、200 MiB/s 的 1:1 读写流量(message size=4kb,batch size = 200kb);此外额外测试二者的极限吞吐。

负载文件:tail-read-100mb.yaml、tail-read-200mb.yaml、tail-read-900mb.yaml

极限吞吐发送延迟:

极限吞吐:

发送耗时和 E2E 耗时的详细数据:

分析:

  1. 相同集群规模下, AutoMQ 的极限吞吐(870MB/S)是 Apache Kafka (280MB/S) 的 3 倍

  2. 相同集群规模和流量(200 MiB/s)下,AutoMQ 的发送延迟 P999 是 Apache Kafka 的 1 / 50, E2E 延迟是 Apache Kafka 的 1/13

  3. 相同集群规模和流量(200 MiB/s)下,AutoMQ 带宽占用是 Apache Kafka 的 1 / 3

3.2 追赶读性能对比

追赶读是消息和流系统常见的场景:

  • 对于消息来说,消息通常用作业务间的解耦和削峰填谷。削峰填谷要求消息队列能将上游发送的数据堆积住,让下游慢慢的消费,这时候下游追赶读的数据都是不在内存中的冷数据。

  • 对于流来说,周期性的批处理任务需要从几个小时甚至一天前的数据开始扫描计算。

  • 额外还有故障场景:消费者宕机故障若干小时后恢复重新上线;消费者逻辑问题,修复后,回溯消费历史数据。

追赶读主要关注两点:

  • 追赶读的速度:追赶读速度越快,消费者就能更快从故障中恢复,批处理任务就能更快产出分析结果。

  • 读写的隔离性:追赶读需要尽量不影响生产的速率和延时。

测试
本测试测量 AutoMQ 和 Apache Kafka 在相同集群规模下的追赶读性能,测试场景如下:

  1. 各自部署6台数据节点,创建 1 个 100 分区的 Topic

  2. 以 300 MiB/s 的吞吐持续发送。

  3. 在发送 1TiB 数据后,拉起消费者,从最早的位点开始消费。

负载文件:catch-up-read.yaml

测试结果:

分析

  • 相同集群规模下,AutoMQ 的追赶读峰值是 ApacheKafka 的 2 倍。

  • 追赶读期间,AutoMQ 的发送流量没有受到任何影响, AutoMQ 的平均发送延迟上升了约 0.4 ms;而 Apache Kafka 的发送流量下降了 10%,平均发送延迟也飙升到了 900ms。这是由于,Apache Kafka 在追赶读时会读取硬盘,且没有做 IO 隔离,这占用了云盘的读写带宽,导致写硬盘带宽减少,发送流量下降;同时读硬盘中的冷数据会污染 page cache,同样会导致写入延迟升高。作为对比,AutoMQ 读写分离,在追赶读时不会读硬盘,而是读对象存储,不会占用硬盘读写带宽,也就不会影响发送流量和延迟。

3.3 分区迁移能力对比

本测试测量 AutoMQ 和 Apache Kafka 在带日常发送消费流量场景下,迁移一个具备 30 GiB 数据的分区到一个不存在该分区副本的节点的迁移耗时和影响。具体的测试场景为:

  1. 2 台 broker,在其上创建:
  • 1 个单分区单副本的 Topic A,并以 40 MiB/s 吞吐持续读写。

  • 1 个 4 分区单副本的 Topic B,并以 10 MiB/s 吞吐持续读写,作为背景流量。

  1. 10 分钟后,将 Topic A 的唯一一个分区迁移到另一个节点,迁移吞吐限制 100 MiB/s。负载文件:partition-reassign.yaml

分析

  • AutoMQ 分区迁移只需要将 EBS 中缓冲的数据上传到 S3 即可在新的节点安全打开,500 MiB 的数据通常在 2~5 秒内即可完成上传。AutoMQ 分区的迁移耗时和分区的数据量无关,分区迁移时间平均下来在 2 秒左右。AutoMQ 分区在迁移过程中向客户端返回 NOT_LEADER_OR_FOLLOWER 错误码,在迁移完成后客户端更新到新的 Topic 路由表,客户端内部重试发送到新的节点,因此该分区的此刻的发送延迟会上涨,迁移完成后恢复到日常水位。

  • Apache Kafka 分区迁移需要将分区的副本拷贝到新的节点,拷贝历史数据的同时还要追赶新写入的数据,迁移的耗时 = 分区数据量 / (迁移吞吐限制 - 分区写入吞吐),在实际生产环境中,分区迁移往往是小时级的,本测试中的 30 GiB 的分区迁移耗时就到了 15 分钟。除了迁移耗时长以外,Apache Kafka 迁移需要从硬盘读取冷数据,即使在设置了 throttle 的情况下,仍旧会因为抢占 page cache 导致发送延迟的抖动,影响服务质量。

END

关于我们

我们是来自 Apache RocketMQ 和 Linux LVS 项目的核心团队,曾经见证并应对过消息队列基础设施在大型互联网公司和云计算公司的挑战。现在我们基于对象存储优先、存算分离、多云原生等技术理念,重新设计并实现了 Apache Kafka 和 Apache RocketMQ,带来高达 10 倍的成本优势和百倍的弹性效率提升。

🌟 GitHub 地址:https://github.com/AutoMQ/automq
💻 官网:https://www.automq.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/374830.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elon Musk开源Grok

转载自:AILab基地 早在6天前,马斯克就发文称xAI将开源Grok 图片 13小时前,马斯克开源了旗下公司X的Grok训练模型,并喊话OpenAI,你名字里的Open到底在哪里 图片 下面是xai-org的GitHub开源地址[https://github.com/x…

yolov8、RTDETR无法使用多个GPU训练

yolov8、RTDETR无法使用多个GPU训练 网上看了好多解决方法: 什么命令行 CUDA_VISIBLE_DEVICES0,1 python train.py 环境变量都不行 最后找到解决方案:在ultralytics/engine/trainer.py 中的第246行 将 self.model DDP(self.model, device_ids[RANK])…

学习测试7-ADB的使用

ADB是什么? ADB,即 Android Debug Bridge(安卓调试桥) 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell&…

C++|智能指针

目录 引入 一、智能指针的使用及原理 1.1RAII 1.2智能指针原理 1.3智能指针发展 1.3.1std::auto_ptr 1.3.2std::unique_ptr 1.3.3std::shared_ptr 二、循环引用问题及解决方法 2.1循环引用 2.2解决方法 三、删除器 四、C11和boost中智能指针的关系 引入 回顾上…

如何分析软件测试中发现的Bug!

假如你是一名软件测试工程师,每天面对的就是那些“刁钻”的Bug,它们像是隐藏在黑暗中的敌人,时不时跳出来给你一个“惊喜”。那么,如何才能有效地分析和处理这些Bug,让你的测试工作变得高效且有趣呢?今天我…

SpringBoot配置flyway

背景 目前我们的项目代码都会交由Git、SVN等版本管理工具进行管理,但是我们的sql脚本,尤其是各类ddl脚本并没有进行版本的管理(python的web框架Django默认就提供了类似的工具,从一开始就鼓励开发者通过版本管理的方式进行数据库的…

Android Studio 的Gradle下载慢,Gradle切换下载源

看图 下面的文字地址因为转义符号的问题,https后面少了一个斜杠看图片进行补充,直接复制不知道能不能用 distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-8.7-bin.zip

第一关:Linux基础知识

Linux基础知识目录 前言LinuxInternStudio 关卡1. InternStudio开发机介绍2. SSH及端口映射2.1 什么是SSH?2.2 如何使用SSH远程连接开发机?2.2.1 使用密码进行SSH远程连接2.2.2 配置SSH密钥进行SSH远程连接2.2.3 使用VScode进行SSH远程连接 2.3. 端口映射…

进度条提示-在python程序中使用避免我误以为挂掉了

使用库tqdm 你还可以手写一点,反正只要是输出点什么东西都可以; Demo from chatgpt import time from tqdm import tqdm# 示例函数,模拟长时间运行的任务 def long_running_task():total_steps 100for step in tqdm(range(total_steps), …

手机容器化 安装docker

旧手机-基于Termux容器化 1、安装app 在手机上安装Termux或ZeroTermux(Termux扩展) 1.1 切换源 注:可以将termux进行换源,最好采用国内源,例如:清华源等 更新包列表和升级包(可选&#xff0…

vue 画二维码及长按保存

需求 想要做如下图的二维码带文字&#xff0c;且能够长按保存 前期准备 一个canvas安装qrcode&#xff08;命令&#xff1a;npm i qrcode&#xff09; 画二维码及文字 初始化画布 <template><div><canvas ref"canvas" width"300" he…

8627 数独

为了判断数独解是否合法&#xff0c;我们需要遵循以下步骤&#xff1a; 1. **检查每一行**&#xff1a;确保1到9每个数字在每一行中只出现一次。 2. **检查每一列**&#xff1a;确保1到9每个数字在每一列中只出现一次。 3. **检查每个3x3的宫**&#xff1a;确保1到9每个数字在…

在pycharm中使用jupyter

在pycharm中使用jupyter 前置条件&#xff1a;你的环境中应该有juptyer &#xff0c;没有的话 pip install jupyter 点击项目目录&#xff0c;右键->new->jupyter notebook 打开file settings 找到 jupyter server &#xff08;按照默认的用代理服务器就行&#xff09; P…

东芝 TB5128FTG 强大性能的步进电机驱动器

TB5128FTG它以高精度和高效能为设计理念&#xff0c;采用 PWM 斩波方法&#xff0c;并内置时钟解码器。通过先进的 BiCD 工艺制造&#xff0c;这款驱动器提供高达 50V 和 5.0A 的输出额定值&#xff0c;成为广泛应用场景中的强劲解决方案。 主要特性 TB5128FTG 拥有众多确保高…

码云远程仓库, 回滚到指定版本号

1. 打开项目路径, 右击Git Bash Here 2. 查找历史版本 git reflog 3. 回退到指定版本 git reset --hard 版本号 4. 强制推送到远程 git push -f

SQL基础-DQL 小结

SQL基础-DQL 小结 学习目标&#xff1a;学习内容&#xff1a;SELECTFROMWHEREGROUP BYHAVINGORDER BY运算符ASC 和 DESC 总结 学习目标&#xff1a; 1.理解DQL&#xff08;Data Query Language&#xff09;的基本概念和作用。 2.掌握SQL查询的基本语法结构&#xff0c;包括SEL…

基于Android平台开发,购物商城

相关视频教程在某站上面(&#x1f50d;浩宇软件开发) 1. 项目功能思维导图 2. 项目涉及到的技术点 使用SQLite数据库实现数据存储使用CountDownTimer实现启动页倒计时使用SharedPreferences实现记住密码登录使用BottomNavigationView实现底部导航栏使用ActivityFragment实现底…

C++:红黑树

概念 红黑树是一种二叉搜索树&#xff0c;一般的二叉搜索会发生不平衡现象&#xff0c;导致搜索效率下降&#xff0c;于是学者们开始探索如何让二叉搜索树保持平衡&#xff0c;这种树叫做自平衡二叉搜索树。起初学者发明了AVL树&#xff0c;其通过一定算法保持了二叉搜索树的严…

【Linux】进程7——查看进程

1.为什么进程管理这么重要呢&#xff1f; 这是因为&#xff1a; 首先&#xff0c;我们在操作系统时的各项任务其实都是经过某个PID来完成的&#xff08;包括你的bash环境&#xff09;&#xff0c;因此&#xff0c;能不能执行某项任务&#xff0c;就与该进程的权限有关了。再来…

【Java数据结构】初识线性表之一:顺序表

使用Java简单实现一个顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 线性表大致包含如下的一些方法&#xff1a; public class MyArrayList { private int[] array; pri…