RabbitMQ 消息持久化/镜像队列/lazy对时延影响
测试背景:
不同条件下RabbitMQ不同队列类型的生产时延测试:
测试环境:
机型:rabbimtq.2u4g.cluster 背景流量:1000 TPS
测试条件:
消息大小 4k,消息条数为1000条,时延取值为平均时延
测试结果:
测试场景 | 生产时延一 | 生产时延二 | 生产时延三 |
---|---|---|---|
普通队列 | 3 | 3 | 3 |
普通队列+持久化 | 3 | 3 | 3 |
普通队列+开启生产确认 | 47 | 47 | 47 |
普通队列+开启事务 | 50 | 51 | 51 |
惰性队列 | 2 | 2 | 3 |
惰性队列+持久化 | 3 | 3 | 3 |
惰性队列+生产确认 | 50 | 51 | 51 |
惰性队列+开启事务 | 54 | 55 | 55 |
镜像队列(2副本) | 2 | 3 | 3 |
镜像队列+生产确认 | 48 | 48 | 48 |
测试结论:
如上测试场景,开启消息持久化/开启镜像队列/配置惰性队列 并不会对消息生产时延造成较大影响,对生产时延造成较大影响的主要因素为开启生产确认或使用事务机制。
消息的deliveryMode /Queue的durable状态 | true | false |
---|---|---|
1:不持久化 | 不持久化 | 不持久化 |
2:持久化 | 持久化 | 不持久化 |
想要宕机时保证消息不丢失,则队列及消息都需要开启持久化
代码示例:
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
// 持久化exchange
channel.exchangeDeclare("test", "fanout", true);
// 持久化队列
channel.queueDeclare("queue", true, false, false, new HashMap<>());
channel.basicPublish("test", "test", MessageProperties.PERSISTENT_TEXT_PLAIN, sb.toString().getBytes());