RabbitMQ的消息确认、消息持久化

本文详细介绍了RabbitMQ的消息确认机制,包括消息发送到交换机的确认和从交换机到队列的确认。同时,阐述了消息的持久化方法,以确保消息在RabbitMQ重启后仍能被投递。此外,还讨论了消息积压问题及解决方案,建议合理设置prefetch_count以平衡处理速度和内存占用。
摘要由CSDN通过智能技术生成

1. 消息的发送确认

生产者发送消息,先将消息发送到 Exchange,然后由 Exchange 再路由到 Queue,这中间就需要确认两个事情

  • 确认消息是否成功发送到 Exchange
  • 确认消息是否从 Exchange 成功路由到 Queue

Spring 提供了两个 回调函数 来处理这两种消息发送确认

1.1. 确认消息是否成功发送到 Exchange

一般会采用轻量级的 Confirm 确认机制,跟手动 Ack 机制类似。生产者将消息发送到 RabbitMQ,且将消息持久化到硬盘后,RabbitMQ 会通过一个回调方法将 Confirm 信息回传给生产端。这样,如果生产端收到了这个 Confirm 信息,就知道是该消息已经持久化到磁盘了;否则,那么就说明这条消息可能半路丢失了,此时你就可以重新投递消息到 MQ 去,确保消息不会丢失

1.1.1. 使用 Confirm 确认机制

实现 ConfirmCallback 并重写 confirm 回调方法。消息发送到 Broker 后触发回调,可以确认消息是否成功发送到 Exchange

# 开启 confirms 回调,确认消息是否成功发送到 Exchange
spring.rabbitmq.publisher-confirms=true
@Autowired
private CachingConnectionFactory connectionFactory;

@Bean
public RabbitTemplate rabbitTemplate() {
   
	RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
    rabbitTemplate.setMessageConverter(converter());
    
    // 消息是否成功发送到 Exchange 交换机
    rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
   
    	if (ack) {
   
        	log.info("消息成功发送到Exchange");
            String msgId = correlationData.getId();
            msgLogService.updateStatus(msgId, Constant.MsgLogStatus.DELIVER_SUCCESS);
        } else {
   
           	log.info("消息发送到Exchange失败, {}, cause: {}", correlationData, cause);
        }
    });    
    return rabbitTemplate;
}

1.2. 确认消息是否从 Exchange 交换机成功路由到 Queue 队列

实现 ReturnCallback 并重写 returnedMessage 回调方法,可以确认消息从 EXchange 路由到 Queue 失败。这里的回调是一个失败回调,只有消息从 Exchange 路由到 Queue 失败才会回调这个方法

# 开启 returnedMessage 回调,确认消息是否从 Exchange 成功发送到 -> Queue
spring.rabbitmq.publisher-returns=true
# 触发returnedMessage回调必须设置mandatory=true, 否则Exchange没有找到Queue就会丢弃掉消息, 而不会触发回调
spring.rabbitmq.template.mandatory=true
@Autowired
private CachingConnectionFactory connectionFactory;

@Bean
public RabbitTemplate rabbitTemplate() {
   
	RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
    rabbitTemplate<
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值