我们使用ActiveMQ作为消息传递层–发送大量需要低延迟的消息。 通常它可以正常工作,但是在某些情况下我们遇到了性能问题。 在花了太多时间测试我们的基础架构之后,我想我已经学到了有关ActiveMQ的一些有趣的东西:它可能真的很慢。

尽管一般来说,消息通过ActiveMQ传输不会出现问题,但是我们注意到,当我们收到大量消息时,就会开始看到延迟。 好像我们正在达到某个消息速率限制–当我们超过该消息速率限制时,消息将被延迟,仅在该限制处传递。 从ActiveMQ贴上消息的时间戳起,我们可以看到代理正在快速接受消息,但是发送给使用者的时间有所延迟。

我设置了一个测试工具来复制问题-这很容易。 但是,我在测试系统中测得的吞吐量似乎很低:每秒2500条消息。 对于一个非常简单的消费者而言,基本上什么也不做,因此没有理由将吞吐量如此之低。 为了进行比较,在完全相同的设置中使用定制的消息传递层,我们达到了每秒15,000条消息。 第二个难题是在生产中,我们看到的消息速率仅为250消息/秒。 为什么测试系统比生产系统快10倍?

我开始尝试消除可能性:

  • ActiveMQ上的并发负载没有区别
  • 更改生产者流量控制设置没有影响
  • 更改使用者的预取限制只会使行为变得更糟(我们将数据写入非持久性主题,因此默认的预取限制很高)
  • 似乎没有组件受到带宽或CPU限制

作为实验,我尝试将使用者与代理人和生产者移动到同一台服务器上:消息吞吐量增加了一倍。 将使用者移动到具有更高ping时间的服务器上:消息吞吐量骤降。

这导致了一种洞察力:ActiveMQ代理的行为恰好好像“一次”发送给消费者的数据量受到限制。 我特别意识到,网络上未确认的数据量似乎受到限制。 如果连线较长,则数据到达使用者的时间更长,而确认返回的时间也更长:因此,代理每秒发送较少的数据。

这种行为突出了我们的第一个错误。 我们使用Spring Integration处理用户端的消息路由,在一年前对Spring进行了升级,我们在该版本中获得的更改之一是对消息驱动通道适配器确认JMS消息的方式进行了更改。 以前,我们的消息是自动确认的,但是现在确认模式是“事务处理”的。 这意味着我们必须在将确认发送给代理之前完成整个消息处理链。

这就解释了为什么生产系统(对消息有用的工作)具有比测试系统低得多的数据速率。 不仅是消息必须经过1毫秒的ping时间,消费者还没有发送完确认消息,直到消费者完成了对消息的处理,这可能还要花费几毫秒的时间。

但是更糟糕的是,交易确认似乎完全阻止了用户预取数据! 我们通过事务确认看到的吞吐量是一次在线上一个未确认的消息。 如果我们将消费者移到更远的地方,我们的吞吐量将直线下降。 即,代理在收到之前的确认之前不会发送新消息。 与其代替消费者从经纪人那里预取数百条消息并依次处理它们,而是经纪人耐心地一次发送一条消息! 难怪我们的表现糟透了。

通过spring集成配置更改可以轻松解决此问题。 在测试系统中,我们的消息吞吐量从2500消息/秒增加到10,000消息/秒。 不错的进步。

但是我很好奇,我们仍然会看到经纪人的行为,好像网上未确认数据的数量受到限制吗? 因此,我将使用者转移到相距较远的服务器上进行测试。 结果? 是! 代理仍会限制网络上未确认的数据量。 即使自动确认了消息,对于代理将发送而没有看到确认的数据量也有一个硬性上限。

帽子的大小呢? 约64KB。 是的,在2018年,我的消息传递层一次只能传输64KB的数据。 当经纪人和消费者超级亲密时,这很好。 但是,将消费者与代理之间的ping时间增加到10ms,我们的消息速率将下降到5,000消息/秒。 在100毫秒的往返行程中,我们的消息速率为500消息/秒。

这种行为感觉就像应该控制预取限制:但是,我们看到的消息(不超过60条1kB消息)比预取限制所暗示的要少得多。 到目前为止,我还没有找到关于“消费者窗口大小”是否存在的任何确认。 也没有任何特别修改行为的方法。 使用方上TCP套接字缓冲区大小的增加将传输中的数据量增加到大约80KB,但没有增加。

我很困惑,很多人使用ActiveMQ,而且肯定有人会注意到像这样的数据上限吗? 但是,也许大多数人使用ActiveMQ的消费者和经纪人之间的ping时间非常短,根本就不会注意到它?

但是,人们必须在全球分布式部署中使用ActiveMQ –为什么没人能看到这一点?

翻译自: https://www.javacodegeeks.com/2018/09/activemq-performance-testing.html

ActiveMQ性能测试相关推荐

  1. activemq 性能测试_ActiveMQ性能测试

    activemq 性能测试 我们使用ActiveMQ作为消息传递层–发送大量需要低延迟的消息. 通常它可以正常工作,但是在某些情况下我们已经看到性能问题. 在花了太多时间测试我们的基础结构之后,我想我 ...

  2. 简单了解消息中间件及ActiveMQ

    最近阅读文献,发现一篇介绍中间件及ActiveMQ的好文章,特此转载留存,同时也分享给大家.原文献地址:https://segmentfault.com/a/1190000014958916?utm_ ...

  3. ActiveMQ学习笔记03 - 消息持久化

    2019独角兽企业重金招聘Python工程师标准>>> ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,还有一种内存存储的方式,由于内存不属于持久化 ...

  4. 使用jmeter对ActiveMQ集群性能方案进行评估--转载

    原文地址:http://www.51testing.com/html/78/23978-143163.html 1.测试概要 1.1 关于 这篇文档中涉及的基于JMS的消息系统能为应用程序提供可靠的, ...

  5. ActiveMQ;RabbitMQ;ZeroMQ

    中间件类型: Embedded middleware: As the name suggests, this typeof middleware handles embedded applicatio ...

  6. JMS学习八(ActiveMQ消息持久化)

    JMS学习八(ActiveMQ消息持久化) ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,还有一种内存存储的方式,由于内存不属于持久化范畴,而且如果使用内存队列,可 ...

  7. jmeter的java测试框架_性能测试学习之路 (四)jmeter 脚本开发实战(JDBC JMS 接口脚本 轻量级接口自动化测试框架)...

    1.业务级脚本开发 登录脚本->思路:在线程组下新建两个HTTP请求,一个是完成访问登录页,一个是完成登录的数据提交. 步骤如下: 1) 访问登录页 2) 提交登录数据的HTTP PS:对于业务 ...

  8. RocketMq学习笔记001---Kafka,ActiveMQ、RabbitMQ、RocketMQ消息中间件的对比

    分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. 那么, ...

  9. ActiveMQ, RabbitMQ和ZeroMQ 选型关注点

    选择MQ时,主要关注的特性,可能就以下几个: 通信模式(是否满足业务场景): ActiveMQ: queue(producer/consumer), topic(publisher/subsriber ...

最新文章

  1. NTT高级科学家:光子是深度学习的未来!光子有望替代电子计算机加速神经网络计算...
  2. c语言卡尔曼函数库,kalman之c语言实现
  3. 操作系统内存管理——分区、页式、段式管理
  4. 解析:Python为什么这么流行?
  5. Java秒杀系统实战系列~RabbitMQ死信队列处理超时未支付的订单(转)
  6. 如何创建_如何创建自己的微信圈子?圈子创建运营指南
  7. H.264视频编解码的代码移植和优化
  8. php二分法 冒泡 快速排序,PHP 常见算法【冒泡排序, 快速排序, 插入排序, 取舍排序, 二分法查找, .】...
  9. 重用之前应仔细分析问题---------用错轮子有感
  10. 【09】Jenkins:Pipeline 补充
  11. [转]经典正则表达式
  12. SpringBoot 之Thymeleaf模板
  13. 中国射频前端产业现状分析
  14. python代码变成so
  15. Semantic Segmentation: A thorough Review
  16. 数字社会案例集(1.0版本) 附下载
  17. element-ui el-table 表格渲染错位以及高度计算错误问题
  18. [GIS原理] 9 数字地形分析DTA、数字地形模型DTM、数字高程模型DEM、数字地表模型DSM、不规则三角网TIN
  19. 拓嘉辰丰电商:如何投诉拼多多商家一直不发货
  20. HTML5期末大作业:京东网站设计——仿2016版京东首页(1页) HTML+CSS+JavaScript 大学生网页作品 电商网页设计作业模板 学生网页制作源代码下载

热门文章

  1. 2017西安交大ACM小学期数据结构 [分块,区间修改,单点查询]
  2. Dubbo(四)之xml配置方式
  3. 推荐一个实用的 .gitignore 文件
  4. Java Jar包的压缩、解压使用指南
  5. C#的类修饰符和成员修饰符
  6. springboot项目不加端口号也可以访问项目的方法
  7. 使用navicat 复制 数据库 使用mysql5.7 utf8mb4 utf8mb4_general_ci 爬虫的时候就支持表情包了
  8. 系统架构设计师考试999999999999
  9. html5圆形旋转菜单js,jquery 圆形旋转图片滚动切换效果
  10. oracle修改redolog路径,oracle修改redo log files路径