测试RabbitMQ生产速率和消费速率
本章节从实例规格、是否开启SSL、生产者/消费者数量、队列数量、队列类型、Exchange类型的维度进行分布式消息服务RabbitMQ版的性能测试,对比客户端消息生产速率和消费速率,得出性能测试结果。
- 测试场景一(实例规格):相同Exchange、队列、生产者数量、消费者数量、不同的实例规格
- 测试场景二(是否开启SSL):相同Exchange、队列、生产者数量、消费者数量、实例规格,开启SSL和未开启SSL的实例
- 测试场景三(生产者/消费者数量):相同Exchange、队列、实例规格,不同数量的生产者和消费者
- 测试场景四(单队列和多队列):相同Exchange、生产者数量、消费者数量、实例规格,不同的队列数量
- 测试场景五(队列类型):相同Exchange、生产者数量、消费者数量、实例规格,不同的队列类型
- 测试场景六(Fanout Exchange):相同实例规格、Fanout Exchange、队列数量,不同生产者数量、消费者数量

由于网络环境的影响和客户端的不同,测试结果可能会有差异。
测试环境
进行性能测试前,您需要先构建如下的测试环境:
- 购买如表1所示RabbitMQ 3.8.35版本的集群实例,购买方法请参考购买RabbitMQ实例。
- 设置连接RabbitMQ密码时,建议不要使用特殊字符。如果使用特殊字符,在使用测试脚本时,需要对特殊字符进行转义处理,否则会报错。
- 购买“rabbitmq-2u4g”实例时,请开启公网访问,并在安全组中入方向规则中放通15672端口,以便在浏览器中访问WebUI界面。
表1 实例参数 名称
代理数量
规格
是否开启SSL
磁盘类型
rabbitmq-ssl
3
rabbitmq.2u4g.cluster
是
超高I/O
rabbitmq-2u4g
3
rabbitmq.2u4g.cluster
否
超高I/O
rabbitmq-4u8g
3
rabbitmq.4u8g.cluster
否
超高I/O
rabbitmq-8u16g
3
rabbitmq.8u16g.cluster
否
超高I/O
rabbitmq-16u32g
3
rabbitmq.16u32g.cluster
否
超高I/O
购买完成后,在实例详情页获取RabbitMQ实例的内网连接地址,并记录购买实例时设置的用户名和密码。如果是“rabbitmq-2u4g”实例,除了内网连接地址、用户名和密码外,还需要记录Web界面UI地址,此地址在后续登录WebUI界面设置镜像队列和惰性队列时需要使用。
- 在“rabbitmq-2u4g”实例中,登录WebUI,并设置镜像队列、惰性队列和仲裁队列。
- 在“rabbitmq-2u4g”实例的“/”Vhost下,创建“fanout”类型的Exchange,具体步骤请参考创建RabbitMQ Exchange。
- 获取测试工具rabbitmq-perf-test-2.18.0-bin.tar.gz。
- 购买客户端服务器。
购买区域、可用区、虚拟私有云、子网、安全组与RabbitMQ实例保持一致,规格为16U32G,Linux系统的ECS服务器,具体步骤请参考购买弹性云服务器。
购买完成ECS后,需要在ECS中完成以下配置:
- 安装Java JDK,并配置JAVA_HOME与PATH环境变量。
export JAVA_HOME=/root/jdk1.8.0_231 export PATH=$JAVA_HOME/bin:$PATH
- 下载rabbitmq-perf-test-2.18.0-bin.tar.gz,并解压。
tar -zxvf rabbitmq-perf-test-2.18.0-bin.tar.gz
- 安装Java JDK,并配置JAVA_HOME与PATH环境变量。
测试脚本

- 测试脚本自动创建的Exchange类型为“direct”,队列特性为非持久化、自动删除,在测试fanout类型Exchange和仲裁队列时,需要在脚本后增加“--predeclared”,表示使用自己定义的Exchange和队列参数。
- 测试开启SSL的实例时,需要将“amqp://”修改为“amqps://”,表示以加密形式传输数据。
单队列测试脚本:
./runjava com.rabbitmq.perf.PerfTest -h amqp://{实例用户名}:{实例密码}@{内网连接地址} -e {Exchange名称} -s 1024 -u {队列名称} -x {生产者个数} -y {消费者个数} -z {运行时间}
参数名称 |
说明 |
---|---|
实例用户名 |
购买实例时设置的用户名。 |
实例密码 |
购买实例时设置的密码。 |
内网连接地址 |
购买实例后获取的内网连接地址。 |
Exchange名称 |
待测试的Exchange名称。 |
队列名称 |
待测试的队列名称。 |
生产者个数 |
生产者的数量。 |
消费者个数 |
消费者的数量。 |
运行时间 |
脚本的运行时间,单位为秒。 |
多队列测试脚本:
./runjava com.rabbitmq.perf.PerfTest -h amqp://{实例用户名}:{实例密码}@{内网连接地址} -e {Exchange名称} -s 1024 -x {生产者个数} -y {消费者个数} -z {运行时间} --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to x
参数名称 |
说明 |
---|---|
实例用户名 |
购买实例时设置的用户名。 |
实例密码 |
购买实例时设置的密码。 |
内网连接地址 |
购买实例后获取的内网连接地址。 |
Exchange名称 |
待测试的Exchange名称。 |
生产者个数 |
生产者的数量。 |
消费者个数 |
消费者的数量。 |
运行时间 |
脚本的运行时间,单位为秒。 |
queue-%d |
表示多个队列,队列名称前缀为queue-,%d表示变量,取值为从--queue-pattern-from数值到--queue-pattern-to数值的连续整数。 例如:--queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to 3,表示3个队列,队列名称为queue-1、queue-2、queue-3。 |
测试步骤
- 登录客户端服务器,进入“rabbitmq-perf-test-2.18.0/bin”目录下。
- 运行以下脚本,测试并记录不同实例规格下的生产速率和消费速率。
./runjava com.rabbitmq.perf.PerfTest -h amqp://{实例用户名}:{实例密码}@{内网连接地址} -e {Exchange名称} -s 1024 -u {队列名称} -x 3 -y 3 -z 300
示例如下:
./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-direct -s 1024 -u queue-1 -x 3 -y 3 -z 300
- 运行以下脚本,测试并记录rabbitmq-ssl实例在不同生产者数量、消费者数量、队列数量的生产速率和消费速率。
单队列测试脚本:
./runjava com.rabbitmq.perf.PerfTest -h amqps://{实例用户名}:{实例密码}@{内网连接地址} -e {Exchange名称} -s 1024 -u {队列名称} -x {生产者个数} -y {消费者个数} -z 300
示例如下:
./runjava com.rabbitmq.perf.PerfTest -h amqps://test:******@192.168.0.150:5671 -e exchange-direct -s 1024 -u queue-1 -x 1 -y 1 -z 300
多队列测试脚本:
./runjava com.rabbitmq.perf.PerfTest -h amqps://{实例用户名}:{实例密码}@{内网连接地址} -e {Exchange名称} -s 1024 -x 3 -y 3 -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to x
示例如下:
./runjava com.rabbitmq.perf.PerfTest -h amqps://test:******@192.168.0.150:5671 -e exchange-direct -s 1024 -x 3 -y 3 -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to 3
- 运行以下脚本,测试并记录rabbitmq-2u4g实例在不同生产者数量、消费者数量、队列数量的生产速率和消费速率。
单队列测试脚本:
./runjava com.rabbitmq.perf.PerfTest -h amqp://{实例用户名}:{实例密码}@{内网连接地址} -e {Exchange名称} -s 1024 -u {队列名称} -x {生产者个数} -y {消费者个数} -z 300
示例如下:
./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-direct -s 1024 -u queue-1 -x 1 -y 1 -z 300
多队列测试脚本:
./runjava com.rabbitmq.perf.PerfTest -h amqp://{实例用户名}:{实例密码}@{内网连接地址} -e {Exchange名称} -s 1024 -x {生产者个数} -y {消费者个数} -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to x
示例如下:
./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-direct -s 1024 -x 3 -y 3 -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to 3
- 运行以下脚本,测试并记录rabbitmq-2u4g实例在不同生产者数量、消费者数量、队列数量、队列类型的生产速率和消费速率,其中队列类型分别为“惰性”、“镜像”和“仲裁”。
单队列测试脚本(不包括仲裁队列):
./runjava com.rabbitmq.perf.PerfTest -h amqp://{实例用户名}:{实例密码}@{内网连接地址} -e {Exchange名称} -s 1024 -u {队列名称} -x {生产者个数} -y {消费者个数} -z 300
示例如下:
./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-direct -s 1024 -u queue-1 -x 1 -y 1 -z 300
多队列测试脚本(不包括仲裁队列):
./runjava com.rabbitmq.perf.PerfTest -h amqp://{实例用户名}:{实例密码}@{内网连接地址} -e {Exchange名称} -s 1024 -x {生产者个数} -y {消费者个数} -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to x
示例如下:
./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-direct -s 1024 -x 3 -y 3 -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to 3
单队列测试脚本(仲裁队列):./runjava com.rabbitmq.perf.PerfTest -h amqp://{实例用户名}:{实例密码}@{内网连接地址} -e {Exchange名称} -s 1024 -u {队列名称} -x {生产者个数} -y {消费者个数} -z 300 --predeclared
示例如下:
./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-direct -s 1024 -u queue-1 -x 1 -y 1 -z 300 --predeclared
多队列测试脚本(仲裁队列):
./runjava com.rabbitmq.perf.PerfTest -h amqp://{实例用户名}:{实例密码}@{内网连接地址} -e {Exchange名称} -s 1024 -x {生产者个数} -y {消费者个数} -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to x --predeclared
示例如下:
./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-direct -s 1024 -x 3 -y 3 -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to 3 --predeclared
- 运行以下脚本,测试并记录rabbitmq-2u4g实例的Fanout Exchange在不同消费者数量、队列数量的生产速率和消费速率。
单队列测试脚本:
./runjava com.rabbitmq.perf.PerfTest -h amqp://{实例用户名}:{实例密码}@{内网连接地址} -e {Exchange名称} -s 1024 -u {队列名称} -x {生产者个数} -y {消费者个数} -z 300 --predeclared
示例如下:
./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-fanout -s 1024 -u queue-1 -x 1 -y 3 -z 300 --predeclared
测试结果
以下介绍六个测试场景对应的测试结果。