引言

上一期我们对比了三类消息产品(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

64 800 8 9w 8.6w
128 800 9 7.8w 7.7w
256 800 10 7.5w 7.5w

Kafka

64 800 5 13.6w 13.6w
128 256 23 8500 8500
256 256 133 2215 2352

可以看到,不论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,多消费端的业务场景。

附录:

测试环境

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

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

应用版本:

消息中间件 版本
Kafka 0.8.2
RocketMQ 3.4.6

测试脚本

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

未完待续

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

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

消息中间件学习总结(11)——Kafka与RocketMQ的Topic数量对单机性能的影响比较分析相关推荐

  1. 消息中间件系列(八):Kafka、RocketMQ、RabbitMQ等的优劣势比较

    在高并发业务场景下,典型的阿里双11秒杀等业务,消息队列中间件在流量削峰.解耦上有不可替代的作用. 之前介绍了MQ消息队列的12点核心原理总结,以及如何从0到1设计一个MQ消息队列,以及RPC远程调用 ...

  2. 消息中间件学习总结(6)——RocketMQ之RocketMQ大数据畅想

    刚刚过去的双十一,阿里自主研发的消息中间件RocketMQ,充分展现了它的低延迟特性,大部分消息请求落在2ms内,慢请求也都落在20ms内,这无疑给追求快速响应的在线交易系统(OLTP)带去了福音. ...

  3. 消息中间件学习总结(1)——RocketMQ之专访RocketMQ联合创始人:项目思路、技术细节和未来规划

    编者按 这些年开源氛围越来越好,各大IT公司都纷纷将一些自研代码开源出来.2012年,阿里巴巴开源其自研的第三代分布式消息中间件--RocketMQ.经过几年的技术打磨,阿里称基于RocketMQ技术 ...

  4. 消息中间件学习总结(4)——RocketMQ之RocketMQ 迈入50万TPS消息俱乐部

    前言 消息团队一直致力于RocketMQ的性能优化,双十一前进行了低延时(毛刺)优化,保障了双十一万亿消息的流转如丝般顺滑,在2016年双十一种,MetaQ以接近万亿的消息总量支撑着全集团数千个应用, ...

  5. 消息中间件学习总结(3)——RocketMQ之十分钟入门RocketMQ

    本文首先引出消息中间件通常需要解决哪些问题,在解决这些问题当中会遇到什么困难,Apache RocketMQ作为阿里开源的一款高性能.高吞吐量的分布式消息中间件否可以解决,规范中如何定义这些问题.然后 ...

  6. 消息中间件学习总结(9)——RocketMQ与kafka差异比较分析

    淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011年初,Linkin开源了Kaf ...

  7. 消息中间件学习总结(5)——RocketMQ之Apache RocketMQ背后的设计思路与最佳实践

    摘要:为了更好地让开发者们更加深入了解阿里开源,阿里云云栖社区在3月1号了举办"阿里开源项目最佳实践"在线技术峰会,直播讲述了当前阿里新兴和经典开源项目实战经验以及背后的开发思路. ...

  8. 消息中间件学习总结(7)——RocketMQ之万亿级数据洪峰下的分布式消息引擎

    前言 通过简单回顾阿里中间件(Aliware)消息引擎的发展史,本文开篇于双11消息引擎面临的低延迟挑战,通过经典的应用场景阐述可能会面临的问题 - 响应慢,雪崩,用户体验差,继而交易下跌.为了应对这 ...

  9. [转载] 消息中间件学习总结(8)——RocketMQ之RocketMQ捐赠给Apache那些鲜为人知的故事

    参考链接: 捐赠 序言 今年的双十一对阿里巴巴中间件消息团队来说,注定是个不平凡的日子.在这一天,稳定性小组重点攻克的低延迟存储解决方案成功地经受住了大考.整个大促期间,99.996%的延迟落在了10 ...

最新文章

  1. 如何起一个好的学术期刊论文题目?
  2. 如何解释混合网络?—Vecloud微云
  3. android 上下滚动文字_android高仿今日头条富文本编辑(发布文章)
  4. Oracl数据库中大数据的备份-1
  5. BugkuCTF-Crypto题告诉你个秘密
  6. VDI序曲四 个人独享虚拟桌面
  7. [WTL] 改变右击SysMenu后弹出的菜单
  8. 每天学点Shiro-say hello
  9. 《Android 应用案例开发大全(第3版)》——第1.3节Android开发环境的搭建
  10. 零界之痕30号服务器维护,零界之痕12月9日更新了什么 12月9日更新维护公告介绍...
  11. t00lsudf.php,udf提权
  12. 学习Linux七(Linux必学60个命令之【系统管理】)
  13. 副业案例-晴矢分享 短视频MCN亏损500W的总结的血泪经验
  14. IDEA导入UAPStudio(Eclipse)创建的项目
  15. 蓝牙驱动卸载后自动安装_为什么打印机需要安装驱动后才能使用?
  16. 国家开放大学2021春1194建设监理题目
  17. 初学安卓之二维码的简单实现,android开发网上购物app
  18. springboot整合jwt
  19. 深度学习 图像识别 三
  20. 共享店铺系统如何搭建无人共享自习室?

热门文章

  1. adb ps shell 查看进程_注入 init 进程,使得 APP 可调试
  2. python透明图处理_python – 强制matplotlib图的背景是透明的
  3. 实现位数超过32bit的整数的加减乘除运算_Java 运算符
  4. js for in遍历对象_JS中轻松遍历对象属性的几种方式
  5. python 字符串数组_python用法笔记(数组(list、touple、dict)、字符串)
  6. Python中map的使用方法
  7. C++基础与深度解析第二章:对象与基本类型
  8. C语言之字符串探究(二):字符串原生操作——strlen、strcat、strcpy、strcmp自实现
  9. ubuntu指向python3_ubuntu安装python3.7,并更新python默认指向为python3.7
  10. rust这么拆除钢墙_rust腐蚀如何拆墙