0


RabbitMQ 发布确认高级部分

RabbitMQ 发布确认高级部分

1. 什么是发布确认(Publisher Confirms)

发布确认是 RabbitMQ 的一种机制,确保消息成功发送到服务器并持久化。在与 Spring Boot 结合时,可以增强消息的可靠性和监控能力。

2. Spring Boot 中的 RabbitMQ 配置

2.1 添加依赖

pom.xml

中添加 RabbitMQ 的依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

2.2 配置 RabbitMQ

application.yml

中配置 RabbitMQ 的连接信息:

spring:rabbitmq:host: localhost
    port:5672username: guest
    password: guest

3. 启用发布确认

3.1 创建 RabbitTemplate Bean

在 Spring Boot 中,通过配置

RabbitTemplate

来启用发布确认:

importorg.springframework.amqp.rabbit.connection.ConnectionFactory;importorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@ConfigurationpublicclassRabbitConfig{@BeanpublicRabbitTemplaterabbitTemplate(ConnectionFactory connectionFactory){RabbitTemplate rabbitTemplate =newRabbitTemplate(connectionFactory);// 启用发布确认
        rabbitTemplate.setConfirmCallback((correlationData, ack, cause)->{if(ack){System.out.println("消息发送成功,消息 ID: "+ correlationData.getId());}else{System.err.println("消息发送失败,原因: "+ cause);}});return rabbitTemplate;}}

3.2 发送消息

使用

RabbitTemplate

发送消息并自动处理确认:

importorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;@ServicepublicclassMessageService{@AutowiredprivateRabbitTemplate rabbitTemplate;publicvoidsendMessage(String message){
        rabbitTemplate.convertAndSend("my_exchange","my_routing_key", message);System.out.println("发送消息: "+ message);}}

4. 回调函数

4.1 ConfirmCallback

setConfirmCallback

方法设置了确认回调函数。确认成功时会触发此回调,可以根据

ack

参数判断消息是否发送成功。

4.2 处理失败的消息

在确认失败时,可以实现自定义处理逻辑,如重试或记录失败信息:

rabbitTemplate.setConfirmCallback((correlationData, ack, cause)->{if(!ack){System.err.println("消息发送失败,原因: "+ cause);// 可以实现重试逻辑}});

5. 备份交换机(Dead Letter Exchange)

5.1 什么是备份交换机

备份交换机(Dead Letter Exchange, DLX)是用来处理未能成功消费的消息的机制。当消息在队列中达到最大重试次数或过期时,它会被转发到备份交换机。

5.2 配置备份交换机

在 RabbitMQ 中配置备份交换机的步骤:

  1. 定义备份交换机和队列
@BeanpublicQueuemyQueue(){Map<String,Object> args =newHashMap<>();
    args.put("x-dead-letter-exchange","dlx_exchange");// 备份交换机
    args.put("x-dead-letter-routing-key","dlx_routing_key");// 备份路由键returnnewQueue("my_queue",true,false,false, args);}@BeanpublicTopicExchangedlxExchange(){returnnewTopicExchange("dlx_exchange");}@BeanpublicQueuedlxQueue(){returnnewQueue("dlx_queue");}@BeanpublicBindingdlxBinding(){returnBindingBuilder.bind(dlxQueue()).to(dlxExchange()).with("dlx_routing_key");}

5.3 消费失败的消息

在消费者中处理从备份交换机接收到的消息:

importorg.springframework.amqp.rabbit.annotation.RabbitListener;importorg.springframework.stereotype.Component;@ComponentpublicclassDlxMessageListener{@RabbitListener(queues ="dlx_queue")publicvoidhandleDlxMessage(String message){System.out.println("处理失败消息: "+ message);// 处理逻辑,比如记录日志或重试}}

6. 性能优化建议

6.1 批量确认

为了提高性能,可以考虑使用批量消息确认。发送多条消息后再确认,减少网络延迟。

publicvoidsendBatchMessages(int count){for(int i =0; i < count; i++){String message ="Batch Message "+ i;
        rabbitTemplate.convertAndSend("my_exchange","my_routing_key", message);}// 批量确认逻辑}

6.2 调整预取计数

通过调整消费者的预取计数(prefetch count)来优化消息处理性能。设置合理的预取计数可以减少消费者的负载。

@RabbitListener(queues ="my_queue", containerFactory ="rabbitListenerContainerFactory")publicvoidprocessMessage(String message){// 处理逻辑}

6.3 连接池

使用连接池(如

C3P0

HikariCP

)管理 RabbitMQ 的连接,减少连接的创建和销毁开销。

6.4 监控和日志

使用监控工具(如 Spring Boot Actuator)监控 RabbitMQ 的性能和消息流动情况。记录发送和接收的消息状态,以便进行故障排查。

7. 项目地址

你可以访问以下项目地址,获取完整示例代码和更多实现细节:

GitHub 项目地址

标签: rabbitmq ruby 分布式

本文转载自: https://blog.csdn.net/dhrmt/article/details/143259890
版权归原作者 小猫猫猫◍˃ᵕ˂◍ 所有, 如有侵权,请联系我们删除。

“RabbitMQ 发布确认高级部分”的评论:

还没有评论