rabbitmq消息的可靠性投递

简介: rabbitmq消息的可靠性投递

公众号merlinsea


消息的可靠性投递【生产者端保证】:


1、保证消息在生产者投递出去以后,生产者要知道消息投递成功/失败的状态。

2、rabbitmq中消息投递的过程:生产者 -> 交换机 ->队列 ->消费者。

3、生产者到交换机的可靠性保证:confirmCallback机制保证,即消息从生产者到交换机以后,broker会发送ack信息给到生产者,生产者可以根据ack状态来判断消息是成功发送还是失败发送,然后决定接下来的行为。

4、交换机到队列的可靠性保证: returnCallback机制保证,如果消息的交换机找不到对应的路由key和消息的key进行匹配,将会返回ReturnMessage给生 产者。


使用建议:


   开启消息确认机制以后,保证了消息的准确送达,但由于频繁的确认交互, rabbitmq 整体效率变低,吞吐量下降严重,不是⾮常 重要的消息真⼼不建议⽤消息确认机制。


640.jpg

配置文件中开启消息的可靠性保证【默认是不开启】

#消息队列
spring:
  rabbitmq:
    host: 39.107.221.166
    port: 5672
    virtual-host: /dev
    password: password
    username: admin
    #开启消息二次确认,生产者到broker的交换机
    publisher-confirm-type: correlated
    #开启消息二次确认,交换机到队列的可靠性投递
    publisher-returns: true
    #为true,则交换机处理消息到路由失败,则会返回给生产者
    template:
      mandatory: true


生产者端的代码【confirmCallback】:

void testConfirmCallback(){
   //RabbitTemplate对象设置回调函数
   template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
      /**
       * @param correlationData 配置
       * @param ack 交换机是否收到消息,true是成功,false是失败
       * @param cause 失败的原因
       */
      @Override
      public void confirm(CorrelationData correlationData, boolean ack, String cause) {
         System.out.println("ConfirmCallback======>");
         System.out.println("correlationData======>correlationData="+correlationData);
         System.out.println("ack======>ack="+ack);
         System.out.println("cause======>cause="+cause);
         if(ack){
            System.out.println("发送成功");
            //更新数据库 消息的状态为成功  TODO
         }else {
            System.out.println("发送失败,记录到日志或者数据库");
            //更新数据库 消息的状态为失败  TODO
         }
      }
   });
   //数据库新增一个消息记录,状态是发送  TODO
   //发送消息
   //template.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, "order.new","新订单");
   //发送到一个不存在的exchange上
   template.convertAndSend(RabbitMQConfig.EXCHANGE_NAME+"error", "order.new","新订单");
}

640.jpg

生产者端代码 【returnCallback】

/**
 * 交换机到队列可靠性投递测试,也是返回给发送者进行处理,但只有发送失败才会触发returnedMessage
 */
@Test
void testReturnCallback(){
   template.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
      //只有投递失败才会回调这个函数
      @Override
      public void returnedMessage(ReturnedMessage returned) {
         int code = returned.getReplyCode();
         System.out.println("code="+code);
         System.out.println("returned="+returned.toString());
      }
   });
   //投递成功
   //template.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, "order.new","新订单ReturnsCallback");
   //模拟异常,投递的队列不存在
   template.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, "error.order.new","新订单ReturnsCallback");
}

640.jpg


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
8月前
|
消息中间件 存储 监控
|
8月前
|
消息中间件 存储 运维
|
13天前
|
消息中间件 Java 中间件
MQ四兄弟:如何保证消息可靠性
本文介绍了RabbitMQ、RocketMQ、Kafka和Pulsar四种消息中间件的可靠性机制。这些中间件通过以下几种方式确保消息的可靠传输:1. 消息持久化,确保消息在重启后不会丢失;2. 确认机制,保证消息从生产者到消费者都被成功处理;3. 重试机制,处理失败后的重试;4. 死信队列,处理无法消费的消息。每种中间件的具体实现略有不同,但核心思想相似,都是从生产者、中间件本身和消费者三个角度来保障消息的可靠性。
17 0
|
5月前
|
消息中间件 存储 运维
RabbitMQ-消息消费时的可靠性保障
将这些实践融入到消息消费的处理逻辑中,可以很大程度上保障RabbitMQ中消息消费的可靠性,确保消息系统的稳定性和数据的一致性。这些措施的实施,需要在系统的设计和开发阶段充分考虑,以及在后续的维护过程中不断的调整和完善。
66 0
|
6月前
|
消息中间件 存储 RocketMQ
消息队列 MQ使用问题之进行超过3天的延迟消息投递,采用多次投递的策略是否有风险
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
8月前
|
消息中间件 存储 运维
深入理解MQ消息队列的高可用与可靠性策略
深入理解MQ消息队列的高可用与可靠性策略
1353 3
|
8月前
|
消息中间件 Java API
【微服务系列笔记】MQ消息可靠性
消息可靠性涉及防止丢失,包括生产者发送时丢失、未到达队列以及消费者消费失败处理后丢失。 确保RabbitMQ消息可靠性的方法有:开启生产者确认机制,确保消息到达队列;启用消息持久化以防止未消费时丢失;使用消费者确认机制,如设置为auto,由Spring确认处理成功后ack。此外,可开启消费者失败重试机制,多次失败后将消息投递到异常交换机。
138 1
|
8月前
|
消息中间件 供应链 Java
RabbitMQ入门指南(九):消费者可靠性
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了消费者确认机制、失败重试机制、失败处理策略、业务幂等性等内容。
306 0
RabbitMQ入门指南(九):消费者可靠性
|
8月前
|
消息中间件 Java 微服务
RabbitMQ入门指南(七):生产者可靠性
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了消息丢失的可能性、生产者可靠性中的生产者重试机制和生产者确认机制等内容。
235 0
RabbitMQ入门指南(七):生产者可靠性
|
8月前
|
消息中间件 安全 Java
SpringBoot基于RabbitMQ实现消息可靠性
SpringBoot基于RabbitMQ实现消息可靠性
120 0