为了更全面地了解 Pulsar 和 Kafka,我们“复现”了 Confluent 对 Pulsar 和 Kafka 基准测试。重复这一基准测试的原因有两个,一是 Confluent 的测试方法存在一些问题;二是 Confluent 的测试范围和测试场景不够全面。为了更准确地对比 Pulsar 和 Kafka,我们在测试中不仅修复了 Confluent 测试中的问题,还扩大了测试范围,纳入更多性能衡量标准,模拟更多实际场景。
和 Confluent 的测试相比,我们的测试主要有三项改进:
我们进行了最大吞吐量测试、发布和端到端延迟测试、追赶读测试和混合工作负载测试(详见上篇)。由于篇幅有限,本篇主要介绍发布和端到端延迟测试详情。
测试目标:观测在处理发布和追尾读工作负载时 Pulsar 和 Kafka 可实现的最低延迟。
测试设置:通过调整订阅数量和分区数量,观测订阅数量和分区数量对发布延迟和端到端延迟的影响。
测试策略:
各项测试结果如下。
#1 100 个分区, 1 个订阅
我们从 100 个分区、1 个订阅开始,在所有不同持久性保证下,对 Pulsar 和 Kafka 能实现的最低延迟进行了基准测试。
测试证明,在所有持久性级别上,Pulsar 的发布延迟和端到端延迟都比 Kafka 低,是 Kafka 的 1/5 到 1/2。
发布延迟 - 同步本地持久性
使用两种复制持久性设置(分别为 ack-1 和 ack-2)和同步本地持久性时,Pulsar 和 Kafka 发布延迟的差异如图 10。表 2 为每种情况下的精确延迟数值。在异步复制持久性(ack-1)下,Pulsar P99 延迟是 Kafka 的 1/3; 在同步复制持久性(ack-2)下是 Kafka 的 1/5。
图 10 Pulsar 和 Kafka 的发布延迟(数据同步)
表 2 Pulsar 和 Kafka 的实际发布延迟测试结果(数据同步)
平均值 | P50 | P90 | P99 | P999 | |
---|---|---|---|---|---|
pulsar-ack-1 | 3.23 | 3.21 | 4.23 | 4.73 | 5.89 |
pulsar-ack-2 | 3.64 | 3.42 | 4.47 | 10.37 | 32.74 |
kafka-ack-1 | 2.54 | 1.99 | 3.78 | 11.37 | 18.71 |
kafka-ack-all | 9.84 | 5.71 | 19.7 | 58.83 | 164.20 |
为了更深入地了解延迟如何随时间变化,我们绘制了 Pulsar 和 Kafka 采取不同复制持久性设置时的 P99 延迟图。如图 11 所示,Pulsar 的延迟比较稳定(约 5 毫秒),但 Kafka 的延迟波动较大。对于关键任务服务(mission-critical services)来说,稳定、持续的低延迟至关重要。
图 11 Pulsar 和 Kafka 的 P99 延迟
端到端延迟--同步本地持久性
使用两种复制持久性设置(分别为 ack-1 和 ack-2)和同步本地持久性时,Pulsar 和 Kafka 端到端延迟的差异如图 12。表 3 为每种情况下的精确延迟数值。在异步复制持久性(ack-1)下,Pulsar P99 端到端延迟是 Kafka 的 1/3,在同步复制持久性(ack-2)下是 Kafka 的 1/5。
图 12 1 个订阅时,Pulsar 和 Kafka 的端到端延迟(数据同步)
表 3 1 个订阅时,Pulsar 和 Kafka 的实际端到端延迟测试结果(数据同步)
平均值 | P50 | P90 | P99 | P999 | |
---|---|---|---|---|---|
pulsar-ack-1 | 4.32 | 4.41 | 5.35 | 5.86 | 7.65 |
pulsar-ack-2 | 4.72 | 4.65 | 5.60 | 11.64 | 33.90 |
kafka-ack-1 | 6.23 | 4.91 | 9.08 | 18.75 | 91.74 |
kafka-ack-all | 12.89 | 7.53 | 23.07 | 64.62 | 169.83 |
发布延迟 - 异步本地持久性
使用两种复制持久性设置(分别为 ack-1 和 ack-2)和异步本地持久性时,Pulsar 和 Kafka 发布延迟的差异如图 13。表 4 为每种情况下的精确延迟数值。在异步复制持久性(ack-1)下,Kafka 性能更优,但 Pulsar P99 发布延迟更稳定(低于 5 毫秒),增加复制持久性保证(从 ack-1 到 ack-2)并未影响延迟。在同步复制持久性(ack-2)下,Kafka P99 发布延迟是 Pulsar 的 2 倍。
图 13 Pulsar 和 Kafka 的发布延迟(无数据同步)
表 4 Pulsar 和 Kafka 的实际发布延迟测试结果(无数据同步)
平均值 | P50 | P90 | P99 | P999 | |
---|---|---|---|---|---|
pulsar-ack-1 | 2.81 | 2.79 | 3.8 | 4.21 | 5.45 |
pulsar-ack-2 | 2.99 | 2.97 | 3.96 | 4.47 | 6.19 |
kafka-ack-1 | 1.74 | 1.62 | 2.60 | 3.06 | 9.91 |
kafka-ack-all | 3.01 | 2.77 | 3.97 | 8.47 | 15.57 |
为了更深入地了解发布延迟如何随时间变化,我们绘制了 Pulsar 和 Kafka 在不同复制持久性设置下的 P99 发布延迟图。如图 14 所示,Pulsar 的延迟始终保持在较低的水平(低于 5 毫秒),而 Kafka 的延迟始终是 Pulsar 的 2 倍。
图 14 不同复制持久性设置下,Pulsar 和 Kafka 的 P99 发布延迟
端到端延迟--异步本地持久性
使用两种复制持久性设置(分别为 ack-1 和 ack-2)和异步本地持久性时,Pulsar 和 Kafka 端到端延迟的差异如图 15。表 5 为每种情况下的精确延迟数值。在所有情况下,Pulsar 的性能都优于 Kafka。Pulsar P99 端到端延迟保持稳定(约 5 毫秒),改变复制持久性设置对其并无影响。对于 ack-1,Kafka 的 P99 端到端延迟比 Pulsar 高;对于 ack-2,Kafka 的 P99 端到端延迟是 Pulsar 的 2 倍。
图 15 1 个订阅时,Pulsar 和 Kafka 的端到端延迟(无数据同步)
表 5 1 个订阅时,Pulsar 和 Kafka 的实际端到端延迟测试结果(无数据同步)
平均值 | P50 | P90 | P99 | P999 | |
---|---|---|---|---|---|
pulsar-ack-1 | 3.96 | 3.99 | 4.90 | 5.33 | 7.93 |
pulsar-ack-2 | 4.06 | 4.17 | 5.08 | 5.55 | 8.52 |
kafka-ack-1 | 4.26 | 4.10 | 5.39 | 6.94 | 17.24 |
kafka-ack-all | 4.22 | 3.96 | 5.19 | 10.43 | 18.95 |
#2 100 个分区, 10 个订阅
了解 Pulsar 和 Kafka 只有一个订阅时的性能后,我们想知道更改订阅数量会如何影响发布延迟和端到端延迟。于是我们把订阅数量从 1 增加到 10,并为每个订阅分配了 2 个消费者。
从表 6 的数据中可以看出,我们的测试结果表明:
表 6 10 个订阅时,发布和端到端延迟的测试结果
发布延迟 | 端到端延迟 | |
---|---|---|
同步本地持久性 | 测试结果 | 测试结果 |
异步本地持久性 | 测试结果 | 测试结果 |
发布延迟 - 同步本地持久性
使用两种复制持久性设置(分别为 ack-1 和 ack-2)和同步本地持久性时,Pulsar 和 Kafka 发布延迟的差异如图 16。表 7 为每种情况下的精确延迟数值。在异步复制持久性(ack-1)下,Pulsar P99 发布延迟仍然是 Kafka 的 1/3。但在同步复制持久性(ack-2)下,Pulsar 的发布延迟是 Kafka 的 1/160(1 个订阅时,Pulsar 的发布延迟是 Kafka 的 1/5)。
图 16 10 个订阅时,Pulsar 和 Kafka 的发布延迟(数据同步)
表 7 10 个订阅时,Pulsar 和 Kafka 的实际发布延迟测试结果(数据同步)
平均值 | P50 | P90 | P99 | P999 | |
---|---|---|---|---|---|
pulsar-ack-1 | 3.24 | 3.20 | 4.26 | 4.89 | 10.31 |
pulsar-ack-2 | 3.67 | 3.47 | 4.56 | 9.94 | 31.31 |
pafka-ack-1 | 3.14 | 2.39 | 4.39 | 15.07 | 61.29 |
kafka-ack-all | 290.51 | 176.82 | 724.26 | 1593.46 | 2686.41 |
端到端延迟--同步本地持久性
使用两种复制持久性设置(分别为 ack-1 和 ack-2)和同步本地持久性时,Pulsar 和 Kafka 端到端延迟的差异如图 17。表 8 为每种情况下的精确延迟数值。在异步复制持久性(ack-1)下,Pulsar P99 延迟是 Kafka 的 1/20,在同步复制持久性(ack-2)下是 Kafka 的 1/110 。
图 17 10 个订阅时,Pulsar 和 Kafka 的端到端延迟(数据同步)
表 8 10 个订阅时,Pulsar 和 Kafka 的实际端到端延迟测试结果(数据同步)
平均值 | P50 | P90 | P99 | P999 | |
---|---|---|---|---|---|
pulsar-ack-1 | 4.79 | 4.83 | 6.03 | 7.12 | 15.36 |
pulsar-ack-2 | 5.34 | 5.12 | 6.43 | 14.65 | 39.90 |
kafka-ack-1 | 11.36 | 6.65 | 17.12 | 145.10 | 914.19 |
kafka-ack-all | 296.45 | 171.32 | 731.67 | 1599.79 | 2696.63 |
发布延迟 - 异步本地持久性
使用两种复制持久性设置(分别为 ack-1 和 ack-2)和异步本地持久性时,Pulsar 和 Kafka 发布延迟的差异如图 18。表 9 为每种情况下的精确延迟数值。Pulsar 的性能显著优于 Kafka。Pulsar 的平均发布延迟约为 3 毫秒,P99 延迟在 5 毫秒以内。Kafka 在异步复制持久性(ack-1)下性能令人满意,但在同步复制持久性(ack-2)下性能差了很多。在同步复制持久性下,Kafka 的 P99 发布延迟是 Pulsar 的 270 倍。
图 18 10 个订阅时,Pulsar 和 Kafka 的发布延迟(无数据同步)
表 9 10 个订阅时,Pulsar 和 Kafka 的实际发布延迟测试结果(无数据同步)
平均值 | P50 | P90 | P99 | P999 | |
---|---|---|---|---|---|
pulsar-ack-1 | 2.86 | 2.82 | 3.86 | 4.46 | 11.18 |
pulsar-ack-2 | 3.05 | 3.00 | 4.03 | 4.73 | 10.39 |
kafka-ack-1 | 2.11 | 1.89 | 3.02 | 6.35 | 14.74 |
kafka-ack-all | 158.04 | 17.63 | 526.91 | 1281.25 | 1956.71 |
端到端延迟--异步本地持久性
使用两种复制持久性设置(分别为 ack-1 和 ack-2)和异步本地持久性时,Pulsar 和 Kafka 端到端延迟的差异如图 19。表 10 为不同情况下的精确延迟数值。在所有情况下,Pulsar 的性能始终优于 Kafka。Pulsar 的端到端延迟始终保持在 4~7 毫秒之间,改变复制持久性设置对其并无影响。对于 ack-1,Kafka 的 P99 端到端延迟是 Pulsar 的 13 倍;对于 ack-2,则是 187 倍。
图 19 10 个订阅时,Pulsar 和 Kafka 的端到端延迟(无数据同步)
表 10 10 个订阅时,实际端到端延迟测试结果(无数据同步)
平均值 | P50 | P90 | P99 | P999 | |
---|---|---|---|---|---|
pulsar-ack-1 | 4.51 | 4.47 | 5.60 | 6.84 | 15.77 |
pulsar-ack-2 | 4.61 | 4.61 | 5.76 | 6.94 | 14.21 |
kafka-ack-1 | 8.01 | 5.90 | 9.38 | 89.80 | 532.68 |
kafka-ack-all | 212.77 | 87.72 | 537.85 | 1295.78 | 1971.03 |
#3 100, 5000, 8000, 10000 个分区
了解更改订阅数量会如何影响 Pulsar 和 Kafka 的发布延迟后,我们想更改分区数量,看看会产生什么效果。于是,我们把分区数量从 100 个累加到 10000 个,观察发生了什么变化。
测试数据见表 11,测试结果表明:
表 11 不同 ack 和不同持久性下的实际发布延迟测试结果
Ack = 1 | Ack = 2 | |
---|---|---|
同步本地持久性 | 测试结果 | 测试结果 |
异步本地持久性 | 测试结果 | 测试结果 |
Ack = 1,同步本地持久性
使用同步本地持久性和异步复制持久性 (ack = 1) 更改分区数量时,Pulsar 和 Kafka 发布和端到端延迟的差异分别如图 20 和图 21。
图 20 分区数量不同,ACK=1 时的发布延迟(数据同步)
图 21 分区数量不同,ACK=1 时的端到端延迟(数据同步)
表 12 显示了分区数量不同,ACK=1 时的实际发布延迟测试结果。表 13 显示了分区数量不同,ACK=1 时的实际端到端延迟测试结果。
表 12 分区数量不同,ACK=1 时的实际发布延迟测试结果(数据同步)
平均值 | P50 | P90 | P99 | P999 | |
---|---|---|---|---|---|
kafka-100 | 2.54 | 1.99 | 3.78 | 11.37 | 18.71 |
kafka-5000 | 3.50 | 4.41 | 9.21 | 29.26 | 44.39 |
kafka-8000 | 8.37 | 5.11 | 20.18 | 40.70 | 69.72 |
kafka-10000 | 11.14 | 6.57 | 26.81 | 52.24 | 82.07 |
pulsar-100 | 3.23 | 3.21 | 4.23 | 4.73 | 5.89 |
pulsar-5000 | 3.35 | 3.30 | 4.34 | 5.03 | 13.96 |
pulsar-8000 | 3.67 | 3.67 | 4.89 | 5.61 | 16.07 |
pulsar-10000 | 3.42 | 3.37 | 4.48 | 5.36 | 19.20 |
表 13 分区数量不同,ACK=1 时的实际端到端延迟测试结果(数据同步)
平均值 | P50 | P90 | P99 | P999 | |
---|---|---|---|---|---|
kafka-100 | 6.23 | 4.91 | 9.08 | 18.75 | 91.74 |
pulsar-100 | 4.32 | 4.41 | 5.35 | 5.86 | 7.65 |
pulsar-5000 | 4.52 | 4.53 | 5.55 | 6.26 | 17.78 |
pulsar-8000 | 4.89 | 4.99 | 6.11 | 6.86 | 23.83 |
pulsar-10000 | 4.49 | 4.62 | 5.70 | 6.67 | 27.25 |
图 22 给出了分区数量不同,ACK=1 时 Pulsar 端到端的延迟。图 23 给出了分区数量不同,ACK=1 时 Kafka 端到端的延迟。
图 22 分区数量不同,ACK=1 时 Pulsar 的端到端延迟(数据同步)
图 23 分区数量不同,ACK=1 时 Kafka 的端到端延迟(数据同步)
从以上图表可以看出:
Ack = 2,同步本地持久性
使用同步本地持久性和同步复制持久性(ack = 2)更改分区数量时,Pulsar 和 Kafka 发布延迟的差异如图 24。表 14 为每种情况下的精切延迟数值。
图 24 分区数量不同,ack=2/all 时的发布延迟(数据同步)
表 14 分区数量不同, ack=2/all 时的实际发布延迟测试结果(数据同步)
平均值 | P50 | P90 | P99 | P999 | |
---|---|---|---|---|---|
kafka-100 | 9.84 | 5.71 | 19.7 | 58.83 | 164.20 |
kafka-5000 | 154.50 | 36.86 | 468.75 | 1259.82 | 2017.15 |
kafka-8000 | 283.50 | 124.82 | 784.69 | 1742.27 | 2729.79 |
kafka-10000 | 259.50 | 96.15 | 731.85 | 1718.09 | 2684.28 |
pulsar-100 | 3.64 | 3.42 | 4.47 | 10.37 | 32.74 |
pulsar-5000 | 3.84 | 3.57 | 4.69 | 12.81 | 42.83 |
pulsar-8000 | 4.15 | 3.97 | 5.23 | 11.90 | 42.19 |
图 25 和图 26 分别显示了更改分区数量如何影响 Pulsar 和 Kafka 端到端的延迟。
图 25 分区数量不同,ack=2 时 Pulsar 的端到端延迟(数据同步)
图 26 分区数量不同,ack=2 时 Kafka 的端到端延迟(数据同步)
从以上图表可以看出:
Ack = 1, Async 本地持久性
使用异步本地持久性和异步复制持久性(ack = 1)更改分区数量时,Pulsar 和 Kafka 发布延迟的差异如图 27。表 15 为不同情况下的精切延迟数值。
图 27 分区数量不同,ack=1 时的发布延迟(无数据同步)
表 15 分区数量不同,ack=1 时的实际发布延迟测试结果(无数据同步)
平均值 | P50 | P90 | P99 | P999 | |
---|---|---|---|---|---|
kafka-100 | 1.74 | 1.62 | 2.60 | 3.06 | 9.91 |
kafka-5000 | 4.13 | 3.05 | 5.20 | 25.32 | 33.86 |
kafka-8000 | 6.84 | 4.32 | 16.51 | 34.19 | 46.34 |
kafka-10000 | 8.95 | 5.32 | 22.75 | 41.83 | 59.32 |
pulsar-100 | 2.86 | 2.79 | 3.8 | 4.21 | 5.45 |
pulsar-5000 | 2.98 | 2.95 | 3.89 | 4.51 | 7.85 |
pulsar-8000 | 3.26 | 3.27 | 4.50 | 5.14 | 15.21 |
pulsar-10000 | 3.06 | 2.97 | 4.15 | 5.23 | 19.47 |
图 28 和图 29 分别显示了更改分区数量如何影响 Pulsar 和 Kafka 端到端的延迟。
图 28 分区数量不同,ack=1 时,Pulsar 端到端的延迟(无数据同步)
图 29 分区数量不同,ack=1 时,Kafka 端到端的延迟(无数据同步)
从以上图表可以看出:
Ack = 2,异步本地持久性
使用异步本地持久性和同步复制持久性 (ack = 2)更改分区数量时,Pulsar 和 Kafka 发布延迟的差异如图 30。表 16 为每种情况下的精确延迟数值。
图 30 分区数量不同,ack=all/2 的发布延迟(无数据同步)
表 16 分区数量不同,ack=all/2 的实际发布延迟测试结果(无数据同步)
平均值 | P50 | P90 | P99 | P999 | |
---|---|---|---|---|---|
kafka-100 | 3.01 | 2.77 | 3.97 | 8.47 | 15.57 |
kafka-5000 | 19.33 | 10.16 | 40.40 | 121.40 | 336.21 |
kafka-8000 | 138.19 | 42.52 | 385.86 | 1164.90 | 2008.28 |
kafka-10000 | 266.66 | 102.55 | 752.95 | 1717.83 | 2797.51 |
pulsar-100 | 2.99 | 2.97 | 3.96 | 4.47 | 6.19 |
pulsar-5000 | 3.13 | 3.10 | 4.17 | 4.98 | 9.45 |
pulsar-8000 | 3.44 | 3.44 | 4.64 | 5.36 | 12.92 |
pulsar-10000 | 3.32 | 3.24 | 4.39 | 6.18 | 23.10 |
图 31 和图 32 分别显示了更改分区数量如何影响 Pulsar 和 Kafka 端到端的延迟。
图 31 分区数量不同,ack=2 时 Pulsar 的端到端延迟(无数据同步)
图 32 分区数量不同,ack=2 时 Kafka 的端到端延迟(无数据同步)
从以上图表可以看出:
基于基准测试结果,我们得出以下结论:
原文链接:https://streamnative.io/en/blog/tech/2020-11-09-benchmark-pulsar-kafka-performance-report
领取专属 10元无门槛券
私享最新 技术干货