Kafka vs RocketMQ—— Topic数量对单机性能的影响

转载 2018年04月15日 11:36:16

引言

上一期我们对比了三类消息产品(Kafka、RabbitMQ、RocketMQ)单纯发送小消息的性能,受到了程序猿们的广泛关注,其中大家对这种单纯的发送场景感到并不过瘾,因为没有任何一个网站的业务只有发送消息。本期,我们就来模拟一个真实的场景:

  1. 消息的发送和订阅一定是共存的
  2. 要支持多个订阅端订阅自己感兴趣的消息
    鉴于上一期Kafka和RocketMQ的指标和关注度很高,本期我们将只针对这两个产品,对比在上述场景中,究竟谁更胜一筹。在正式开始测试之前,首先要向大家明确2个概念:

Topic为何物

Topic是消息中间件里一个重要的概念,每一个Topic代表了一类消息,有了多个Topic,就可以对消息进行归类与隔离。

可以参照下图的动物园喂食模型,每一种动物都只能消费相对应的食品。

分区为何物

Kafka和RocketMQ都是磁盘消息队列的模式,对于同一个消费组,一个分区只支持一个消费线程来消费消息。过少的分区,会导致消费速度大大落后于消息的生产速度。所以在实际生产环境中,一个Topic会设置成多分区的模式,来支持多个消费者,参照下图:

在互联网企业的实际生产环境中,Topic数量和分区都会比较多,这就要求消息中间件在多Topic共存的时候,依然能够保证服务的稳定性。下面就进入测试环节,看看消息发送端,订阅端共存时,Kafka和RocketMQ对多Topic的处理能力。

测试目的

对比发送端、接收端共存情况下,Topic数量对Kafka、RocketMQ的性能影响,分区数采用8个分区。这次压测我们只关注服务端的性能指标,所以压测的退出标准是:

不断增加发送端的压力,直到系统吞吐量不再上升,而响应时间拉长。此时服务端出现性能瓶颈,获取相应的系统最佳吞吐量,整个过程中保证消息没有累积。

测试场景

默认每个Topic的分区数为8,每个Topic对应一个订阅者,逐步增加Topic数量。得到如下数据:



产品


Topic数量


发送端并发数


发送端RT(ms)


发送端TPS


消费端TPS


RocketMQ
6480089w8.6w
12880097.8w7.7w
256800107.5w7.5w


Kafka
64800513.6w13.6w
1282562385008500
25625613322152352

可以看到,不论Topic数量是多少,Kafka和RocketMQ均能保证发送端和消费端的TPS持平,就是说,保证了消息没有累积。

根据Topic数量的变化,画出二者的消息处理能力的对比曲线如下图:

从图上可以看出:

  1. Kafka在Topic数量由64增长到256时,吞吐量下降了98.37%。
  2. RocketMQ在Topic数量由64增长到256时,吞吐量只下降了16%。

为什么两个产品的表现如此悬殊呢?这是因为Kafka的每个Topic、每个分区都会对应一个物理文件。当Topic数量增加时,消息分散的落盘策略会导致磁盘IO竞争激烈成为瓶颈。而RocketMQ所有的消息是保存在同一个物理文件中的,Topic和分区数对RocketMQ也只是逻辑概念上的划分,所以Topic数的增加对RocketMQ的性能不会造成太大的影响。

测试结论

在消息发送端,消费端共存的场景下,随着Topic数的增加Kafka吞吐量会急剧下降,而RocketMQ则表现稳定。因此Kafka适合Topic和消费端都比较少的业务场景,而RocketMQ更适合多Topic,多消费端的业务场景。

附录:

测试环境

服务端为单机部署,机器配置如下:


CPU24核
内存94G
硬盘Seagate Constellation ES (SATA 6Gb/s) 2,000,398,934,016 bytes [2.00 TB] 7202 rpm
网卡1000Mb/s


应用版本:
消息中间件版本
Kafka0.8.2
RocketMQ3.4.6

测试脚本

压力端Jmeter的java客户端
消息大小128字节
并发数能达到服务端最大TPS的最优并发
Topic分区数量8
刷盘策略异步落盘

未完待续

经过上面的测试,RocketMQ几乎是完胜Kafka,其实这并不奇怪,因为RocketMQ就是针对互联网的生产要求孕育而生的,读者现在也应该明白为什么RocketMQ可以支撑阿里集团的海量消息业务了吧。

本期测试暂时告一段落了,测试中涉及到的多Topic场景,其实压测时间均只有20分钟,对于一个消息中间件产品来说,过短的执行时间是无法判断它们的稳定性的。下一期我们会继续探索多分区场景下,Kafka和RocketMQ对外服务的稳定性。敬请期待后续的比拼!


转载于:http://jm.taobao.org/2016/03/24/rmq-vs-kafka/

Kafka vs RocketMQ——多Topic对性能稳定性的影响

引言上期我们对比了RocketMQ和Kafka在多Topic场景下,收发消息的对比测试,RocketMQ表现稳定,而Kafka的TPS在64个Topic时可以保持13万,到了128个Topic就跌至0...
  • a137268431
  • a137268431
  • 2018-04-15 11:45:14
  • 25

Kafka 安装和测试

1. 简介  kafka (官网地址:http://kafka.apache.org)是一款分布式消息发布和订阅的系统,具有高性能和高吞吐率。    i. 消息的发布(publish...
  • lulongzhou_llz
  • lulongzhou_llz
  • 2015-09-20 17:23:11
  • 1707

Jmeter教程 简单的压力测试

Jmeter是一个非常好用的压力测试工具。  Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测试需要的脚本写好。   阅读目录 什么是压力测试 做压力测试的常用工具做压...
  • GarfieldEr007
  • GarfieldEr007
  • 2016-12-26 21:26:53
  • 1340

分布式消息队列RocketMQ与Kafka架构上的巨大差异之2 -- CommitLog与ConsumeQueue

在前面Rocket与Kafka的对比之“拨乱反正”续篇中,我们已经提到了RocketMQ和Kafka在架构上面的一个巨大差异:Kafka是每个partition对应一个文件,而RocketMQ是把所有...
  • chunlongyu
  • chunlongyu
  • 2017-01-16 19:01:49
  • 2817

如何为一个kafka集群选择topics/partitions的数量?

How to choose the number oftopics/partitions in a Kafka cluster? 如何为一个kafka集群选择topics/partitions的数量?...
  • kwengelie
  • kwengelie
  • 2016-04-14 11:20:37
  • 10056

Kafka集群搭建详细步骤

Kafka集群搭建 1、 Kafka的安装需要java环境,cent os 7自带java1.6版本,可以不用重新安装,直接使用自带的jdk 即可;如果...
  • zxy987872674
  • zxy987872674
  • 2017-05-18 16:45:06
  • 23613

使用JMeter进行负载测试——终极指南

转载原文:http://www.testwo.com/article/357 这篇教程讨论的是JMeter,它是一款基于Java的、集合了几个应用程序、具有特定用途的负载和性能测试工具。  ...
  • chuntian_feng
  • chuntian_feng
  • 2016-07-10 14:34:00
  • 428

RocketMQ与Kafka对比(18项差异)

转自:https://github.com/alibaba/RocketMQ/wiki/rmq_vs_kafka 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为...
  • damacheng
  • damacheng
  • 2015-01-18 22:42:30
  • 88213

Kafka的topic限制是多少

原文地址:https://cwiki.apache.org/confluence/display/KAFKA/FAQ#FAQ-HowdoesKafkadependonZookeeper? H...
  • tanga842428
  • tanga842428
  • 2016-09-28 18:19:12
  • 3073

(1) windows上kafka安装测试

一 安装zookeeper 单机或伪集群,参考: http://blog.csdn.net/yhl_jxy/article/details/77752725 二 官网下载kafka...
  • yhl_jxy
  • yhl_jxy
  • 2017-10-16 10:26:35
  • 245
收藏助手
不良信息举报
您举报文章:Kafka vs RocketMQ—— Topic数量对单机性能的影响
举报原因:
原因补充:

(最多只允许输入30个字)