前言

下面关注一下rabbitmq实际使用时的性能问题和怎么进行一些优化。

性能测试

针对每个需要生产/消费者与rabbitmq进行通讯的方法进行测试

测试环境

  • 排除网络IO的干扰,采用生产者和消费者都在本地服务器的方式

  • 内存16G,CPU4核,3.1GHZ

  • 操作系统:oracle-linux

  • python版本:3.6.3

测试内容

  • 创建10万个connection连接的平均速度

  • 创建10万个信道的平均速度

  • 创建10万个相同队列的平均速度

  • 创建10万个相同直连交换机的平均速度

  • 创建10万个相同主题交换机的平均速度

  • 创建10万个交换机和队列绑定的平均速度

  • 投递10万条10字节消息的的平均速度

  • 投递10万条300K消息的的平均速度

测试使用的脚本

测试结果

connection连接:单线程496/s,多线程最大750/s

信道创建:单线程800/s,多线程850/s;

队列创建:单线程3867/s,多线程3300/s

交换机创建:单线程3900/s,多线程3250/s

绑定创建:单线程2700/s,多线程2500/s

10字节消息投递速度:10300msg/s

300k消息传递:2400msg/s

总结

  • 可以看到信道的创建速度高于tcp连接,所以一般保持TCP连接而使用多个channel;

  • 对于业务来说,一般是客户端请求服务器提交数据,服务器连接rabbitmq存储数据,那么服务器可以先创建tcp长连接池或channel信道池,到可以提交数据后,服务器直接调用连接对象传递数据。

  • 队列和交换机一般是设置持久化的,它们可以长期存在,而消费者也是预先定义的,可以将队列的声明,交换机声明,绑定放在消费者端;

  • 生产和消费同时消耗rabbitmq的资源,当生产消费不平衡,如生产大于消费造成消息堆积时,消费者的消费速度回随着内存的减小变慢,可能造成性能的急剧恶化;

测试发现的一个问题

使用pika操作rabbitmq,在创建信道池后,如果一段时间rabbitmq的tcp连接没有接受到请求,其会强制关闭tcp连接,造成信道池不可用,所以需要重新开启TCP连接;

参考

rabbitmq之队列性能测试及优化方法(六)的更多相关文章

  1. (十二)RabbitMQ消息队列-性能测试

    原文:(十二)RabbitMQ消息队列-性能测试 硬件配置 宿主机用的联想3850X6的服务器四颗E7-4850v3的处理器,DDR4内存,两块1.25TB的pcie固态.在宿主机上使用的事esxi5 ...

  2. JavaScript字符串数组拼接的性能测试及优化方法

    传统上,字符串连接一直是js中性能最低的操作之一. var text="Hello"; text+=" World!"; 早期浏览器没有对这种运算进行优化.由于 ...

  3. (六)RabbitMQ消息队列-消息任务分发与消息ACK确认机制(PHP版)

    原文:(六)RabbitMQ消息队列-消息任务分发与消息ACK确认机制(PHP版) 在前面一章介绍了在PHP中如何使用RabbitMQ,至此入门的的部分就完成了,我们内心中一定还有很多疑问:如果多个消 ...

  4. rabbitMQ消息队列 – Message方法解析

    消息的创建由AMQPMessage对象来创建$message = new AMQPMessage("消息内容");是不是很简单. 后边是一个数组.可以对消息进行一些特殊配置$mes ...

  5. 十五、.net core(.NET 6)搭建RabbitMQ消息队列生产者和消费者的简单方法

    搭建RabbitMQ简单通用的直连方法 如果还没有MQ环境,可以参考上一篇的博客,在windows系统上的rabbitmq环境搭建.如果使用docker环境,可以直接百度一下,应该就一个语句就可以搞定 ...

  6. (转)RabbitMQ消息队列(六):使用主题进行消息分发

    在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统.Consumer可以监听不同severity的log.但是,这也是它之所以叫做简单日志系统的原因, ...

  7. RabbitMQ消息队列(六):使用主题进行消息分发

    在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统.Consumer可以监听不同severity的log.但是,这也是它之所以叫做简单日志系统的原因, ...

  8. RabbitMQ消息队列(六):使用主题进行消息分发[转]

    在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统.Consumer可以监听不同severity(严重级别)的log.但是,这也是它之所以叫做简单日志 ...

  9. (十)RabbitMQ消息队列-高可用集群部署实战

    原文:(十)RabbitMQ消息队列-高可用集群部署实战 前几章讲到RabbitMQ单主机模式的搭建和使用,我们在实际生产环境中出于对性能还有可用性的考虑会采用集群的模式来部署RabbitMQ. Ra ...

随机推荐

  1. 【其他】UTF-8带签名与不带签名

    在 Visual Web Developer 另存为文件时,有编码选项,其中有: Unicode (UTF-8 with signature) - Codepage 65001 Unicode (UT ...

  2. Mybatis笔记二

    一对一查询 案例:查询所有订单信息,订单信息中显示下单人信息. 注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询.如果从用户信息出发查询用户下的订单信息则 ...

  3. RT thread 设备驱动组件之USART设备

    本文以stm32f4xx平台介绍串口驱动,主要目的是:1.RTT中如何编写中断处理程序:2.如何编写RTT设备驱动接口代码:3.了解串行设备的常见处理机制.所涉及的主要源码文件有:驱动框架文件(usa ...

  4. BZOJ 1875 HH去散步(矩阵快速幂)

    题意: 给定一张无向图,每条路的长度都是1,没有自环,可能有重边,给定起点与终点,求从起点走t步到达终点的方案数. 每一步走的时候要求不能走上一条刚刚走的路. 解析: 显然需要搞出个矩阵之后矩乘. 然 ...

  5. CF961D Pair Of Lines

    题目描述 You are given n n n points on Cartesian plane. Every point is a lattice point (i. e. both of it ...

  6. 进程间通讯-3(Manager)-实现数据的同时修改

    Manager 可以实现列表,字典,变量,锁,信号量,事件等的数据之间的共享.Manager已经默认加锁了.控制数据不会乱. 实现了不同进程之间数据的共享,并且可以同时修改. from multipr ...

  7. BZOJ5314:[JSOI2018]潜入行动——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5314 https://www.luogu.org/problemnew/show/P4516 ht ...

  8. async的基本用法

    1. async函数的基本形式 //函数声明 async function foo() {} //函数表达式 const foo = async function () {}; //对象的方法 let ...

  9. Dalvik虚拟机中DexClassLookup结构解析

    http://blog.csdn.net/roland_sun/article/details/46877563 原文如下: 在Android系统中,所有的类定义以及具体的代码都是包含在DEX文件中的 ...

  10. [mysql]数据库引擎查看

    1.查看数据库引擎 全局下,show engines; 2.察看数据库引擎 show variables like '%engine%'; 或者show create table xxx\G 会显示默 ...