一页结论:每家的问题在哪、怎么选
测了什么:AWS 东京区,四家同为 m7g.xlarge 级 × 3 AZ;撮合订单流(单分区 · 200 B · acks=all + 幂等 · 逐条审计丢失 / 乱序 / 重复);1k–200k msg/s 速率阶梯 + 1 h 浸泡(客户端由同一判据从 38 个调优组合中选出);9 类故障(进程崩溃、受控重启、配置滚动、扩缩、存储 HA 切换、AZ 网络分区、AZ 级组合故障(AWS FIS:断网 + broker 下线)、S3 不可用、失去一套 FSx)。所有数字为实测,详细条件见下一节。
- 客户端陷阱默认客户端参数卡住单分区batch 16 KiB 时只确认 32,120/s;调成 batch.size 256 KiB · zstd(level 1) 后 200k、p99 5.84 ms
- 运维约束配置变更 = 滚动重启,高负载下停写放大单分区混合负载最坏一秒 37.4 s(单流 1.1 s)—— 交易时段不能改配置
- 运维约束EBS 写满 = 整集群不可用实测事故:数据盘 90 % ⇒ 120 个分区离线 ≈ 2 h,扩盘 + 重启才恢复
- 架构限制AZ 网络故障:自愈要 1–2 分钟,半数还有二次停写;运维迁 leader 可压到约 10 sFIS 近似 AZ 故障:最坏一秒 59.9 s–120 s;8 次中 4 次 broker 回来后 leader 被交还给仍断网的它。客户端 request 5 s + delivery 120 s 可把报失败降到 0(delivery 30 s 时每路 7.5–21 万笔),但缩短不了停写;服务端 leader.imbalance=100 实测无效。⇒ 运维 +10 s 主动迁 leader(reassign + preferred 选举,命令 9.4 s–9.8 s)⇒ 最坏一秒降到 7.4 s–11.8 s,2 次失败 + 丢失合计 0
- 强项延迟与长稳最好,受控重启自愈1k p99 4.58 ms;1 h 浸泡 max 27.05 ms;重启停写 ≤ 2.2 s
- 客户端陷阱默认客户端参数同样卡住单分区16 KiB 批时 100k 只确认 85,698/s;调优后 200k、p99 10.55 ms
- 架构限制尾延迟三家托管里最高1 h 浸泡 p99.99 48.95 ms、max 239 ms(Standard 15.35 ms / 27.05 ms);历史回读时写入 max 243 ms
- 架构限制配额是硬墙,没有突发额度超配额不报错只变慢;单 broker IAM 连接 3,100 个里只成功 2,544;TLS 1.3 不支持
- 架构限制AZ 网络故障时部分消息被卡 1.5–2 minFIS 近似 AZ 故障:最坏一秒 89.9 s–118 s,期间仍有确认(不是全停);另:负载下缩容被拒
- 强项维护停写最短最稳配置滚动最坏一秒 ≤ 7.7 s,不随负载放大;不用管盘
- 产品缺陷Q28:短暂网络分区后,生产者永久写不进去FSx 首选 AZ 分区 ≈ 60–80 s ⇒ 3 次里 1 次生产者再也没恢复(broker 一直回 OUT_OF_ORDER);只能重建生产者
- 产品缺陷Q30:双 FSx 回不到单 FSx缩容后 broker 崩溃 1,266 次、控制台挂起不报错;唯一出路删实例重建(40 min,数据丢弃)
- 产品缺陷5.5.7 回归:S3 不可用就停写S3 不可用 300 s ⇒ 停写 106 s–120 s(5.5.6 为 0 s)
- 产品缺陷Q29:不出故障也停写12 个生产者、无任何故障:CPU 背压把请求配额 20,000 → 2,388,produce 一起被限,最长确认 8.6 s;无开关
- 架构限制FSx 是全集群唯一的 WAL 单点FIS 拿掉 FSx 首选节点所在的 AZ ⇒ 三个 AZ 的生产者全停,最坏一秒 300 s(其他 AZ:72.4 s);双 FSx 是负载分摊不是切换,失去一套 ≈ 5 min 停写 300 s–1,176 s 且须人工重启
- 架构限制延迟下限由 S3 WAL 决定1k 时 p99 478 ms;调参只抬吞吐(到 100k),p50 始终 ≈ 360 ms
- 运维约束高可用数据不足故障数据只有早一轮,未做逐条审计、浸泡与 AZ 分区
产品缺陷 厂商要修;客户端 / 配置绕不开 · 架构限制 方案本身如此,换配置也不变 · 运维约束 能管住,但要有人管 · 客户端陷阱 默认参数不行,必须调
怎么选
| 场景 | 选 | 必须做到 |
|---|---|---|
| 撮合订单总线(单分区、严格有序、不能停写) | MSK Standard | 客户端 batch.size 256 KiB · zstd(level 1),并设 request.timeout 5 s · delivery.timeout 120 s(AZ 网络故障时 0 报失败);配置变更放在休市窗口;EBS 容量告警;预案写明「AZ 网络故障 ≈ 1 min 停写、可能二次停写 ⇒ 10 s 内由运维迁 leader(实测迁后最坏一秒 7.4 s–11.8 s)」 |
| 同上,但更在意维护停写、不想管盘 | MSK Express | 同样调客户端;接受更高的尾延迟与配额硬墙;短连接网关用连接池 |
| 能容忍分钟级停写的多分区管道 | MSK 两家;AutoMQ 商业版须评估 | AutoMQ:订单 topic 排除自动均衡并钉位、FSx 独占留 IOPS、不上双 FSx |
| 不在意延迟的批量 / 日志 | AutoMQ 开源版 | 接受 ≈ 360 ms 的写确认 |
测试条件
先把条件钉死:只有条件相同的格子才并排比较。下面是环境、AZ 布局、负载与方法,以及哪些格子不能比。
环境
| 项 | MSK Standard | MSK Express | AutoMQ 商业版(FSx WAL) | AutoMQ 开源版(S3 WAL) |
|---|---|---|---|---|
| 版本 | Kafka 4.1.x(KRaft) | Kafka 4.2.x(KRaft) | BYOC 控制台 8.4.8 · 数据面 5.5.7(对照 5.5.6) | 1.7.4(基于 Kafka 3.9.1) |
| broker(性能测试) | 3 × kafka.m7g.xlarge(4 vCPU),每 AZ 1 台 | 3 × express.m7g.xlarge(4 vCPU),每 AZ 1 台 | 3 × m7g.xlarge(4 vCPU),每 AZ 1 台 | 3 × m7g.xlarge(4 vCPU),每 AZ 1 台,controller + broker 合一 |
| 持久化 | EBS 400 GiB × 3;RF 3 · min.insync 2 | 托管存储;3 副本 | 单套 FSx for ONTAP(MULTI_AZ_2,1 个 HA pair:首选 az2 / 备用 az1),384 MBps,SSD 1,024–1,536 GiB;冷数据 S3;broker 单副本。双 FSx 只用于「双 FSx」专项(11-06 起) | S3(WAL 与数据);broker 单副本 |
| 客户端 | c7g.2xlarge × 3,每 AZ 1 台 | 同左(同一组客户端) | c7g.2xlarge × 3,每 AZ 1 台(独立 VPC) | c7g.2xlarge × 1,apne1-az1(独立 VPC,与 broker 同 AZ 布局) |
| 客户端参数(按同一规则选出的各自最优) | batch.size 256 KiB · zstd(level 1) · in-flight 1 · linger 0 | batch.size 256 KiB · zstd(level 1) · in-flight 1 · linger 0 | batch.size 256 KiB · zstd(level 1) · in-flight 5 · linger 1 · 关 zone router · delivery 120 s | batch.size 512 KiB · linger 5 · zstd(level 1) · in-flight 5 |
| 性能测试 | 2026-11-07(r4 同一轮) | 2026-11-07(r4 同一轮) | 2026-11-07(r4 同一轮,重建后的单 FSx 实例) | 2026-11-07(r4 同一轮) |
| 故障测试 | 11-02 → 11-07 · kafka.m7g.large · 默认客户端;受控重启 / FIS 11-08 · xlarge | 11-01 → 11-07 · express.m7g.large · 默认客户端;受控重启 / FIS 11-08 · xlarge | 11-02 → 11-08 · 5.5.7 · 推荐客户端 | 10-28 → 10-29(早一轮) |
AZ 布局:每样东西在哪个 AZ
三个 AZ 各一台 broker、一台客户端;单分区 topic 的 leader 一律在 apne1-az1。AutoMQ 商业版的 WAL 只落在 FSx 的两个节点上(首选 az2、备用 az1),az1 / az4 的 broker 每写一条都要跨 AZ —— 这决定了它的延迟底线,也决定了它对 az2 网络分区最敏感。
负载与测量方法
| Region / AZ | AWS 东京区 ap-northeast-1;AZ ID apne1-az1 / apne1-az2 / apne1-az4 |
| 写入语义 | acks=all + 幂等;开环定速(按计划时刻发送);延迟从计划发送时刻算起;丢弃预热 10 s |
| 单分区(业务场景) | 1 个分区,leader 钉在 apne1-az1;负载测试的生产者在 az1;故障测试三路生产者分在 az1 / az2 / az4 |
| 多分区(大数据场景) | 24 分区,每台 broker 各 8 个 leader |
| 消息与 key | 200 B 订单 JSON(1,024 条互不相同,压缩比真实)+ 28 B 审计头;另有 4 KiB;64 个 key;同一个 Bench.java v8(kafka-clients 4.1.1) |
| 速率阶梯 | 1k / 5k / 10k / 20k / 50k / 100k / 200k msg/s,每档 120 s;四家同一轮(r4) |
| 调优 | 先按 MSK 圣经整理的 14 个参数扫 38 格(batch.size / zstd / in-flight / linger),再由代码按同一判据给每家选最优配置(不由人挑),最后用它跑阶梯与浸泡 |
| 浸泡 | 20k msg/s × 200 B × 1 h,单生产者,最优配置 |
| 故障 | 三路审计流各 5k msg/s × 200 B;t = 120 s 注入;NACL 规则并行生效,时长从生效时刻计 |
| 审计 | 消费端逐条核对丢失 / 乱序 / 重复 / 「报失败但已写入」 |
不可比清单
- 故障测试的规格:受控重启与 AZ 级组合故障为 11-08 在 *.m7g.xlarge 上测(受控重启与 large 结果一致);其余 MSK 故障行测于 11-07 之前(*.m7g.large、默认客户端)。性能一节四家均为 m7g.xlarge、调优后同一轮。
- 进程崩溃:MSK 托管服务不能对 broker 进程注入 kill -9;MSK 只有受控重启(RebootBroker)。
- AZ 网络分区:只切网(NACL)时 MSK broker 健康、不切换 leader,与 AutoMQ 不可比;可比的是「AZ 级组合故障」行:AWS FIS 同时切断 broker 所在子网并让该 broker 下线。FIS 没有 MSK 专用动作,MSK 副本复制走服务侧网络、客户切不断 ⇒ 仍不是真实 AZ 断电。
- 开源版的故障数据:只有早一轮(10-28/29):故障负载 2k msg/s × 512 B × 12 分区,未逐条审计 ⇒ 故障图中标「早一轮」。延迟 / 吞吐为 r4 同一轮。
- 受控维护:AutoMQ 商业版的「受控重启」是 ec2 stop 触发的受控关闭;MSK 是 RebootBroker;只比较对写入的影响。
四种架构:一条消息要走完哪几步才算写成功
同一种画法横排对照。数字越多的步骤、越远的落盘位置,延迟底线越高;标红的是单点。
这一步决定延迟的底线:单分区 1k msg/s 实测 p50 —— Standard 3.29 ms · Express 4.21 ms · AutoMQ 商业版 6.71 ms · AutoMQ 开源版 352 ms。
计分卡:12 条判据
在上面的条件与架构下得出;判定只针对撮合订单总线(低延迟、严格有序、不能停写);每格是实测值,「—」不计分。
| 判据(门槛) | MSK Standard | MSK Express | AutoMQ 商业版(FSx WAL) | AutoMQ 开源版(S3 WAL) | |
|---|---|---|---|---|---|
| 延迟 | 单分区 p99(1k–20k msg/s)≤ 10 ms | ✓4.6–4.7 ms | ✓8.0–8.5 ms | ✓7.7–8.1 ms | ✕≈ 478 ms |
| 1 h 浸泡 p99.99 / max(最优配置)≤ 50 / 200 ms | ✓15.3 / 27 ms | !49.0 / 239 ms | ✓33.8 / 89 ms | —未测 | |
| 12 生产者同写,无故障不停写(多分区,调优后)无 > 1 s | ✓max 48.75 ms | ✓max 70.93 ms | ✕max 7,551 ms | —未测 | |
| 历史回读期间写入 max≤ 200 ms | ✓47.00 ms | !243 ms | !258 ms | —未测 | |
| 吞吐 | 单分区可持续上限(最优配置)≥ 50k msg/s 且 p99 ≤ 20 ms | ✓200k · p99 5.84 ms | ✓200k · p99 10.55 ms | ✓200k · p99 8.66 ms | !100k · p99 496 ms |
| 高可用 | 进程崩溃后自愈且 ≤ 30 s(以下高可用行测于 11-07 前)≤ 30 s | —不可注入 | —不可注入 | !16.1 s–34.2 s,9 次全部自愈 | ✓12.0 s(早一轮 1 次) |
| AZ 级组合故障(FIS 近似,非真实断电)自愈且 ≤ 30 s | !59.9 s–120 s;1 / 2 次二次停写 | !89.9 s–118 s;期间仍有确认 | ✕其他 AZ 69.5 s–72.4 s;FSx 首选 AZ 全集群 300 s | —未测 | |
| 受控维护(重启 / 配置滚动)≤ 10 s | !重启 ≤ 2.2 s;配置滚动最高 37.4 s | ✓重启 ≤ 2.6 s;配置滚动 ≤ 7.7 s | ✓受控关闭 2.4 s;扩缩 ≤ 0.27 s | ✓3.4 s(早一轮) | |
| WAL 存储所在 AZ 分区自愈且 ≤ 30 s | —不可比 | —不可比 | ✕210 s;1 / 3 次永久卡死 | —未测 | |
| 依赖存储故障(S3 不可用)≤ 10 s | ✓不依赖 | ✓不依赖 | ✕106 s–120 s | —未测 | |
| 存储单点单一存储故障不致全停 | ✓RF 3 | ✓托管 | ✕FSx;双 FSx 也不能消除 | ✓S3 区域级 | |
| 数据安全(已确认 0 丢 / 乱序 / 重复)0 | ✓0 / 0 / 0 | ✓0 / 0 / 0 | ✓0 / 0 / 0 | —未做逐条审计 | |
| 成本 | 同规格月成本(推算)— | —$1,575 | —$2,782 | —$2,930–$3,084 | —$747 |
| 撮合订单总线 | 有条件适合调优后单分区 200k · p99 5.84 ms;故障全部自愈;维护须避开交易时段 | 有条件适合调优后单分区 200k · p99 10.55 ms;高负载下维护停写最短最稳 | 不适合Q28 永久卡死、Q29 背压停写、S3 回归、Q30 FSx 缩容致 broker 永久下线;FSx 单点,双 FSx 也不能消除 | 不适合S3 WAL 延迟下限:1k 时 p99 478 ms,参数调不动 | |
✓ 合适 · ! 有条件 · ✕ 不合适 · — 不可测 / 未测 / 不计分。每格数字由登记表从原始结果算出。
成本
同规格月成本(东京区公开价目 × 测试规格 × 声明的负载)
堆叠条 = 各计费项;AutoMQ 商业版的许可是区间(厂商公开价目的低 / 高档)。
- 从低到高:AutoMQ 开源版 < Standard < Express < AutoMQ 商业版。
- AutoMQ 商业版的 FSx(吞吐 + SSD + 额外 IOPS)一项 $1,641/月,超过 MSK Standard 整套($1,575)。
- 开源版最便宜,但延迟高两个数量级(见延迟一节)。
- 跨 AZ 流量四家都一样($276/月):本页的低延迟配置都让客户端直连 leader;AutoMQ 的零跨 AZ 路由(zone router)会把 p99 拉到 13.75 ms。
- 负载
- 20k msg/s × 200 B 持续 30 天 ≈ 10,368 GB 写入;读 1 份;保留 24 h(≈ 346 GB)
- 规格
- 与实测相同:3 broker(MSK 为 *.m7g.xlarge),MSK Standard 每台 EBS 400 GiB,FSx 384 MBps / 1 TiB SSD / 6,144 IOPS(免费 3,072,余量见 X6)
- 价目
- AWS Price List API,ap-northeast-1,按需价,30 天 = 730 h
- 账单核对
- Cost Explorer 2026-11-05 全天单套 FSx:吞吐 $42/天 vs 模型 $40/天;额外 IOPS $4/天
- 跨 AZ
- 3 AZ 均匀分布 ⇒ 2/3 客户端流量跨 AZ,每 GB 两端各 $0.01
- 未计
- S3 请求费、FSx 备份、监控、支持费、RI / SP 折扣
数据表 · 月成本
| 产品 | 项 1 | 项 2 | 项 3 | 项 4 | 项 5 | 项 6 | 项 7 | 项 8 | 合计 / 月 |
|---|---|---|---|---|---|---|---|---|---|
| MSK Standard | broker 小时 $1,154 | EBS 存储 $144 | 客户端跨 AZ 流量 $276 | $1,575 | |||||
| MSK Express | broker 小时 $2,308 | 写入费 $156 | 存储 $41 | 客户端跨 AZ 流量 $276 | $2,782 | ||||
| AutoMQ 商业版(FSx WAL) | EC2 $462 | FSx 吞吐 384 MBps $1,209 | FSx SSD 1 TiB $307 | FSx 额外 IOPS $125 | AutoMQ 许可(低档) $404 | S3 $9 | 客户端跨 AZ 流量 $276 | WAL 跨 AZ 写 FSx $138 | $2,930–$3,084 |
| AutoMQ 开源版(S3 WAL) | EC2 $462 | S3 存储 $9 | 客户端跨 AZ 流量 $276 | $747 |
延迟
单分区:写入确认 p99 随写入速率(各自最优配置)
对数纵轴;虚线 = 10 ms 门槛;✕ = 该速率下生产者跟不上。每家的配置由同一判据从 38 个调优格中选出。
- MSK Standard
- MSK Express
- AutoMQ 商业版(FSx WAL)
- AutoMQ 开源版(S3 WAL)
- 测试
- 四家同一轮(r4,11-07),均为 m7g.xlarge 级别
- 分区
- 1 个,leader apne1-az1
- 生产者
- 1 个,apne1-az1
- 消息
- 200 B 订单 JSON · acks=all · 幂等
- 每档
- 120 s
- 配置
- Standard:batch.size 256 KiB · zstd(level 1) · in-flight 1 · linger 0 | Express:batch.size 256 KiB · zstd(level 1) · in-flight 1 · linger 0 | AutoMQ 商业版:batch.size 256 KiB · zstd(level 1) · in-flight 5 · linger 1 · 关 zone router · delivery 120 s | AutoMQ 开源版:batch.size 512 KiB · linger 5 · zstd(level 1) · in-flight 5
数据表 · 单分区延迟
| 速率 | MSK Standard | MSK Express | AutoMQ 商业版(FSx WAL) | AutoMQ 开源版(S3 WAL) |
|---|---|---|---|---|
| 1k | p99 4.58 ms / p50 3.29 ms | p99 7.96 ms / p50 4.21 ms | p99 7.83 ms / p50 6.71 ms | p99 478 ms / p50 352 ms |
| 5k | p99 4.66 ms / p50 3.31 ms | p99 8.26 ms / p50 4.83 ms | p99 7.84 ms / p50 6.26 ms | p99 482 ms / p50 354 ms |
| 10k | p99 4.71 ms / p50 3.31 ms | p99 8.38 ms / p50 4.86 ms | p99 7.74 ms / p50 6.25 ms | p99 484 ms / p50 354 ms |
| 20k | p99 4.67 ms / p50 3.37 ms | p99 8.51 ms / p50 4.84 ms | p99 8.07 ms / p50 6.28 ms | p99 484 ms / p50 354 ms |
| 50k | p99 4.82 ms / p50 3.46 ms | p99 9.07 ms / p50 4.99 ms | p99 8.06 ms / p50 6.33 ms | p99 486 ms / p50 358 ms |
| 100k | p99 5.04 ms / p50 3.67 ms | p99 9.81 ms / p50 5.13 ms | p99 9.10 ms / p50 6.50 ms | p99 496 ms / p50 362 ms |
| 200k | p99 5.84 ms / p50 4.30 ms | p99 10.55 ms / p50 5.30 ms | p99 8.66 ms / p50 6.67 ms | 过载 |
多分区:写入确认 p99 随写入速率(各自最优配置)
24 分区订单 topic,单生产者,同一套调优配置;大数据场景的参考。
- MSK Standard
- MSK Express
- AutoMQ 商业版(FSx WAL)
- 测试
- 11-08 补全轮,三家 m7g.xlarge 级
- 分区
- me-orders 24 个,64 个 key
- 生产者
- 1 个,apne1-az1
- 配置
- batch 256 KiB · zstd(level 1)
数据表 · 多分区延迟
| 速率 | MSK Standard | MSK Express | AutoMQ 商业版(FSx WAL) |
|---|---|---|---|
| 1k | p99 7.71 ms / p50 4.29 ms | p99 8.05 ms / p50 4.12 ms | p99 10.15 ms / p50 7.08 ms |
| 5k | p99 8.43 ms / p50 5.14 ms | p99 9.72 ms / p50 5.22 ms | p99 12.35 ms / p50 7.28 ms |
| 10k | p99 8.87 ms / p50 5.32 ms | p99 11.35 ms / p50 5.61 ms | p99 13.85 ms / p50 7.54 ms |
| 20k | p99 9.10 ms / p50 5.37 ms | p99 12.95 ms / p50 5.93 ms | p99 13.75 ms / p50 7.76 ms |
| 50k | p99 9.55 ms / p50 5.50 ms | p99 12.95 ms / p50 5.89 ms | p99 14.25 ms / p50 7.95 ms |
| 100k | p99 10.25 ms / p50 5.59 ms | p99 15.25 ms / p50 6.08 ms | p99 15.75 ms / p50 8.21 ms |
| 200k | p99 10.35 ms / p50 5.87 ms | p99 15.45 ms / p50 6.38 ms | p99 17.15 ms / p50 8.35 ms |
单分区:1 小时浸泡的尾部(最优配置)
同一负载跑 1 小时,看 p50 → max 拉多长。
- 负载
- 20k msg/s × 200 B × 1 h
- 分区
- 1 个,leader apne1-az1
- 生产者
- 1 个
- 配置
- 同上图
数据表 · 1 h 浸泡
| 产品 | p50 | p99 | p99.9 | p99.99 | max | > 100 ms 秒数 | 条数 |
|---|---|---|---|---|---|---|---|
| MSK Standard | 3.33 ms | 4.63 ms | 8.68 ms | 15.35 ms | 27.05 ms | 0 | 72,000,000 |
| MSK Express | 4.82 ms | 8.81 ms | 18.75 ms | 48.95 ms | 239 ms | 2 | 72,000,000 |
| AutoMQ 商业版(FSx WAL) | 6.37 ms | 7.89 ms | 15.05 ms | 33.75 ms | 88.82 ms | 0 | 72,000,000 |
吞吐与干扰
调优前后:单分区上限差多少
浅色 = Bench 默认参数(batch.size 16 KiB、不压缩);深色 = 最优配置。MSK 的单分区上限主要卡在客户端默认批大小,不在 broker。
- 判据
- 吞吐达标 = 确认 ≥ 97% 目标速率、0 丢 0 失败、p99 ≤ 自身 1k 时 p99 的 2 倍;低延迟达标 = 吞吐达标且 p50 < 20 ms、无 > 100 ms 的秒。开源版用吞吐达标(S3 WAL 延迟下限)
- 定义
- tools/h2h/r4_table.py(唯一定义;选配置也用它)
- 其余
- 同延迟图
数据表 · 关键格复现 3 次
| 产品 | 单元 | 第 1 次 | 第 2 次 | 第 3 次 | 判定 |
|---|---|---|---|---|---|
| MSK Standard | sp-r10k(调优) | ! p99 4.71 ms | ✓ p99 4.58 ms | ✓ p99 4.63 ms | 不一致 ⇒ 临界点 |
| MSK Standard | sp-r200k(调优) | ✓ p99 5.84 ms | ✓ p99 5.79 ms | ✓ p99 5.96 ms | 一致 |
| MSK Express | sp-r50k(调优) | ! p99 9.07 ms | ✓ p99 9.34 ms | ✓ p99 9.40 ms | 不一致 ⇒ 临界点 |
| MSK Express | sp-r200k(调优) | ✓ p99 10.55 ms | ✓ p99 11.05 ms | ✓ p99 10.75 ms | 一致 |
| AutoMQ 商业版(FSx WAL) | sp-r50k(默认批) | ✕ 过载 | ✕ 过载 | ✓ p99 13.05 ms | 不一致 ⇒ 临界点 |
| AutoMQ 商业版(FSx WAL) | sp-r200k(调优) | ✓ p99 8.66 ms | ✓ p99 9.04 ms | ✓ p99 9.76 ms | 一致 |
数据表 · 调优前后
| 产品 | 默认参数达标到 | 更高档过载时最多确认 | 最优配置达标到 | 最优配置 |
|---|---|---|---|---|
| MSK Standard | 20k | 32,120/s | 200k | batch.size 256 KiB · zstd(level 1) · in-flight 1 · linger 0 |
| MSK Express | 50k | 85,698/s | 200k | batch.size 256 KiB · zstd(level 1) · in-flight 1 · linger 0 |
| AutoMQ 商业版(FSx WAL) | 20k | 62,780/s | 200k | batch.size 256 KiB · zstd(level 1) · in-flight 5 · linger 1 · 关 zone router · delivery 120 s |
| AutoMQ 开源版(S3 WAL) | 1k | 1,460/s | 100k | batch.size 512 KiB · linger 5 · zstd(level 1) · in-flight 5 |
单分区可持续上限(最优配置)
对数横轴;撮合场景的瓶颈是单分区(同一 symbol 不能拆分区)。
- 判据
- 同上;开源版用吞吐达标
- 其余
- 同延迟图
数据表 · 单分区上限
| 产品 | 最高档 | 该档 p99 |
|---|---|---|
| MSK Standard | 200k | 5.84 ms |
| MSK Express | 200k | 10.55 ms |
| AutoMQ 商业版(FSx WAL) | 200k | 8.66 ms |
| AutoMQ 开源版(S3 WAL) | 100k | 496 ms |
AutoMQ 商业版:规避 Q28 的吞吐代价(in-flight 5 vs 1)
Q28 的客户端规避需要 in-flight 1(加关幂等);同一套批大小与压缩下,in-flight 1 的单分区阶梯。
- AutoMQ 商业版(FSx WAL)
- 配置
- batch 256 KiB · zstd(level 1)· linger 1 · 关 zone router · delivery 120 s
- 对照
- 实线 in-flight 5(调优),虚线 in-flight 1
- 注意
- 本格未关幂等(审计需要),只量化 in-flight 1 的吞吐代价
数据表 · in-flight 对比
| 速率 | in-flight 5 | in-flight 1 |
|---|---|---|
| 1k | p99 7.83 ms | p99 12.05 ms |
| 5k | p99 7.84 ms | p99 11.95 ms |
| 10k | p99 7.74 ms | p99 12.15 ms |
| 20k | p99 8.07 ms | p99 12.25 ms |
| 50k | p99 8.06 ms | p99 12.45 ms |
| 100k | p99 9.10 ms | p99 13.25 ms |
| 200k | p99 8.66 ms | p99 13.75 ms |
历史回读对写路径的干扰
两个读者从最早位置回读 30 GB 冷数据,同时 5k msg/s 写订单。
- 回读
- 2 个消费者 × 全速 × 30 GB
- 写入
- 5k msg/s × 200 B,审计
- 开源版
- 未测
高可用
每类故障的停写时长
对数横轴;一行一类故障,每个产品一个点或一段范围(多次 run 的最小–最大);▶ 表示到测试结束仍未恢复。
- MSK Standard
- MSK Express
- AutoMQ 商业版(FSx WAL)
- AutoMQ 开源版(S3 WAL)
- 指标
- 最坏一秒确认延迟(≈ 停写时长)
- 负载
- 三路审计流 × 5k msg/s × 200 B(开源版 2k × 512 B)
- 单分区
- leader apne1-az1;生产者分在 az1 / az2 / az4
数据表 · 故障停写
| 故障 | MSK Standard | MSK Express | AutoMQ 商业版(FSx WAL) | AutoMQ 开源版(S3 WAL) |
|---|---|---|---|---|
| 进程崩溃:kill -9 leader 所在节点 | 托管服务不能注入 | 托管服务不能注入 | 16.1 s–34.2 s(9 次) | 12.0 s(1 次) |
| 受控重启 leader 所在节点 | 1.1 s–2.2 s(2 次) | 2.3 s–2.6 s(2 次) | 2.4 s(1 次) | 3.4 s(1 次) |
| 配置滚动(单分区 24k msg/s + 12 生产者 + 事务) | 37.4 s(1 次) | 4.5 s(1 次) | 未单独测 | 未测 |
| 在线扩缩 | 未测 | 0.28 s(1 次) | 0.07 s–0.27 s(4 次) | 2.4 s(1 次) |
| 存储 HA 主备切换(FSx) | 无此组件 | 服务托管 | 4.0 s–7.6 s(4 次) | 无此组件 |
| AZ 级组合故障(FIS) | 59.9 s–120 s(2 次) | 89.9 s–118 s(2 次) | 69.5 s–72.4 s(2 次) | 未测 |
| AZ 级组合故障:FSx 首选 AZ | 无此单点 | 无此单点 | 300 s(2 次) | 未测 |
| AZ 网络故障 + 运维主动迁 leader(E4) | 7.4 s–11.8 s(2 次) | 未测 | —(FSx 路径问题,迁 leader 无效) | 未测 |
| WAL 存储所在 AZ 网络分区(FSx 首选 AZ) | NACL 只断客户端路径,不可比 | 同左 | 30.3 s–210 s(3 次),有永久卡死 | 未测 |
| 对象存储 S3 不可用 300 s | 不依赖 S3 | 不依赖 S3 | 106 s–120 s(3 次) | S3 即 WAL,未测 |
| 双 FSx:失去其中一套 ≈ 5 min | — | — | 300 s–1,176 s(3 次) | — |
故障时间线:每秒确认数(原始 run 数据)
前两张是 MSK 受控重启;中间两张是 AutoMQ 商业版 —— kill -9 能自愈,FSx 首选 AZ 分区后生产者再也没恢复;最后两张是 AWS FIS 的 AZ 级组合故障。
自愈 · 注入后零确认 0 秒 · 最坏一秒 0.70 s
自愈 · 注入后零确认 0 秒 · 最坏一秒 1.8 s
自愈 · 注入后零确认 15 秒 · 最坏一秒 16.1 s
到测试结束仍为 0 确认(永久卡死) · 注入后零确认 655 秒 · 此后再无确认
自愈 · 注入后零确认 177 秒 · 最坏一秒 120 s
自愈 · 注入后零确认 366 秒 · 最坏一秒 300 s
- 纵轴
- 每秒确认条数(主流 5k/s,补写峰值截到 10k)
- 横轴
- 注入时刻 = 0
- 色带
- 故障持续区间
不出故障也停写:12 个生产者写同一分区
同负载、每秒最大确认延迟(对数纵轴)。
- MSK Standard
- AutoMQ 商业版(FSx WAL)
- 负载
- 单分区 24k msg/s(3 × 5k + 9 × 1k)+ 1 路事务
- AutoMQ
- 45 min,中途做了一次 FSx HA 切换
- MSK
- 同负载 15 min,中途重启一次 broker
每家的不足:把机制画出来
结论很短,原因要讲清楚。以下每一条都来自实测,并画出了从起因到后果的链条。
展开:每个问题从起因到后果的机制图
AutoMQ 商业版(FSx WAL)
① Q28:一次短暂的 AZ 分区,让幂等生产者永久停写
实测(单分区,FSx 首选 AZ 分区 ≈ 60–80 s):3 次中 1 次生产者永久卡死;其余停写 30.3 s–210 s;双 FSx 下同一场景也永久卡死。关幂等 + in-flight 1 可避免永久卡死,但 ≈ 135 s 停写不变。
② Q29:不出故障也停写 —— CPU 背压限的是全部请求,包括 produce
③ FSx 是单点:只有两个节点,首选在 az2
④ 双 FSx 不是故障切换,而是把故障面翻倍
⑤ 其他
- S3 回归:S3 不可用 300 s ⇒ 停写 106 s–120 s(5.5.6 为 0 s)——冷存储故障波及热路径。
- 历史回读干扰:两个读者回读 30 GB 时写入 max 258 ms。
- 自动均衡:每 600 s 迁移 leader,单次停顿约 1–1.9 s;订单 topic 必须排除并钉位。
- FSx 邻居负载:同一 FSx 上的其他负载会让 WAL 停写(3,072 IOPS 时 9 s),FSx 必须独占并留 IOPS 余量。
- Q30:双 FSx 回不去单 FSx:缩容 2 → 1 后一台 broker 启动即致命退出(崩溃 1,266 次),控制台任务挂起不报错、API 无法回退;唯一出路是删实例重建(40 min,数据丢弃)。
AutoMQ 开源版(S3 WAL)
- 延迟 / 吞吐为 r4 同一轮;故障数据只有早一轮,未做逐条审计、浸泡与 AZ 分区。
MSK Standard
① 配置滚动的停写随负载放大
② 磁盘写满 = 整集群不可用
- 数据盘 90 % ⇒ 120 个分区离线 ≈ 2 h,扩盘 + 重启才恢复(实测事故):EBS 不会自动扩,必须配容量告警与保留策略。
- 默认客户端参数是陷阱:batch.size 默认 16 KiB 时单分区只能确认 32,120 msg/s(每个请求只装一个 73 条的批);改成 batch.size 256 KiB · zstd(level 1) · in-flight 1 · linger 0 后到 200k msg/s、p99 5.84 ms。in-flight 加到 5 不增吞吐、只加排队。
- 维护窗口:RebootBroker / 配置变更都由 AWS 滚动执行,交易时段须避开。
MSK Express
- 延迟分布:单分区 p99 7.96 ms–10.55 ms(达标各档);1 h 浸泡 p99.99 48.95 ms、max 239 ms、2 秒超过 100 ms。
- 单分区上限同样卡在默认批大小:默认 16 KiB 批时 100k msg/s 只确认 85,698/s;调大批 + zstd 后到 200k(batch.size 256 KiB · zstd(level 1) · in-flight 1 · linger 0)。不压缩、只调大批也能确认 ≈ 10 万 / s ⇒ 封顶的是每秒请求数,不是字节配额。
- 历史回读拖慢写路径:回读期间写入 max 243 ms(Standard 47.00 ms)。
- 运维约束:钉 leader 要先暂停 Intelligent Rebalancing;时间戳超出 ±24 h 的写入被拒;缩容要求新 broker 上没有用户分区;只开放部分 broker 配置项。
配置滚动:最坏一秒 4.2 s–7.7 s,不随负载放大
方法与经验
复测时最容易让判据「看着在工作、实际没有」的几处。
展开:测试方法与踩坑
- 故障时长要实测,不能信名义值:串行创建 30 条 NACL + 30 个兜底定时任务会让「60 s 切断」实际变成 190 s、三个 AZ 先后生效;已改并行,时长从生效时刻计,并在结果里写实测「注入 → 撤销」秒数。
- 「丢失」先拆开:大流量 + 长停顿后审计消费者会跟不上,尾部会被记成丢失;同分区其他审计流读到末尾 = 数据完整,只有中间缺口才是真丢。
- 文件时间 ≠ 事件时间:压测的真实开始时刻在 .started 文件内容里,用文件 mtime 对齐日志会错开几分钟。
- 放置漂移会让故障失真:隔离后 leader 不迁回,下一次 kill 那台 broker 等于杀一台空节点 —— 结果必须登记为无代表性。
- 客户端规避要实测:linger 5 对 Q29 无效(每生产者 2k msg/s × 24 分区,5 ms 内每分区不到 1 条,攒不成批);关幂等对 Q28 只消除「永久」,不缩短停写。