引言
本文讲解RabbitMQ的高级特性和生产环境最佳实践。
一、死信队列(DLX)
1 2 3 4 5 6 7 8 9 10 11
| channel.exchangeDeclare("dlx_exchange", "direct"); channel.queueDeclare("dlx_queue", true, false, false, null); channel.queueBind("dlx_queue", "dlx_exchange", "dlx_routing_key");
Map<String, Object> args = new HashMap<>(); args.put("x-dead-letter-exchange", "dlx_exchange"); args.put("x-dead-letter-routing-key", "dlx_routing_key"); args.put("x-message-ttl", 10000); channel.queueDeclare("business_queue", true, false, false, args);
|
死信场景:
- 消息被拒绝(basic.reject/basic.nack)且requeue=false
- 消息TTL过期
- 队列达到最大长度
二、延迟队列
2.1 使用TTL+DLX实现
1 2 3 4 5
| Map<String, Object> args = new HashMap<>(); args.put("x-message-ttl", 30000); args.put("x-dead-letter-exchange", "delay_exchange"); channel.queueDeclare("delay_queue", true, false, false, args);
|
2.2 使用延迟插件
1 2 3 4 5 6 7 8 9 10
| Map<String, Object> args = new HashMap<>(); args.put("x-delayed-type", "direct"); channel.exchangeDeclare("delayed_exchange", "x-delayed-message", true, false, args);
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder() .headers(Collections.singletonMap("x-delay", 30000)) .build(); channel.basicPublish("delayed_exchange", "routing_key", props, message.getBytes());
|
三、优先级队列
1 2 3 4 5 6 7 8 9 10
| Map<String, Object> args = new HashMap<>(); args.put("x-max-priority", 10); channel.queueDeclare("priority_queue", true, false, false, args);
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder() .priority(5) .build(); channel.basicPublish("", "priority_queue", props, message.getBytes());
|
四、消息幂等性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| @Component public class MessageConsumer { @Autowired private RedisTemplate<String, String> redisTemplate; @RabbitListener(queues = "order_queue") public void handleMessage(Message message) { String messageId = message.getMessageProperties().getMessageId(); String key = "msg:" + messageId; if (redisTemplate.opsForValue().setIfAbsent(key, "1", 1, TimeUnit.DAYS)) { processMessage(message); } else { System.out.println("重复消息: " + messageId); } } }
|
五、集群搭建
5.1 普通集群
1 2 3 4 5 6 7 8
| rabbitmq-server -detached
rabbitmq-server -detached rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@node1 rabbitmqctl start_app
|
5.2 镜像队列
1 2 3 4
| rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
|
六、性能优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 1. 批量发送 List<String> messages = ...; for (String msg : messages) { channel.basicPublish("", "queue", null, msg.getBytes()); }
2. 预取数量 channel.basicQos(10);
3. 连接池
4. 持久化策略
5. 懒加载队列 Map<String, Object> args = new HashMap<>(); args.put("x-queue-mode", "lazy"); channel.queueDeclare("lazy_queue", true, false, false, args);
|
七、监控告警
1 2 3 4 5 6 7 8 9 10 11
| rabbitmqctl list_queues
rabbitmqctl list_connections
rabbitmqctl list_consumers
http://localhost:15672
|
总结
RabbitMQ高级特性:
- 死信队列:处理异常消息
- 延迟队列:实现定时任务
- 优先级队列:紧急消息优先处理
- 消息幂等:防止重复消费
- 集群搭建:高可用部署
参考资料