• RabbitMQ学习总结(4)-消息处理机制


    1. 正常的消息流程

      

      上面这张图,是一个正常的消息从生产到消息流程。在上一篇文章RabbitMQ学习总结(3)-集成SpringBoot中,代码里使用消息确认,消息回退机制,现在详细说一下。

    2.1 消息发送确认

      消息确认机制,需要实现RabbitTemplate类的一个内部接口ConfirmCallback,这个接口的作用是生产者把消息发送到交换机的结果回调。(Producer ----->  Exchange)

      

      参数包括:

      CorrelationData correlationData:可以封装业务ID信息,需要在发送消息时传入此参数,这里才能接收到,否则是null

      boolean ack:消息发送的结果状态,发送成功是true,失败是false

      String cause:发送失败的描述信息,如果发送成功是null。

        /**
         * A callback for publisher confirmations.
         */
        @FunctionalInterface
        public interface ConfirmCallback {
    
            /**
             * Confirmation callback.
             * @param correlationData correlation data for the callback.
             * @param ack true for ack, false for nack
             * @param cause An optional cause, for nack, when available, otherwise null.
             */
            void confirm(@Nullable CorrelationData correlationData, boolean ack, @Nullable String cause);
    
        }

    2.2 失败回调

      失败回调,需要实现RabbitTemplate类的一个内部接口ReturnCallback,这个接口的作用是消息从交换机到队列的结果回调。(Exchange  -----> Queue )。消息从交换到队列失败,失败原因可能是路由键不存在,通道未绑定等等,一般都跟配置有关系。

      参数包括:

      Message message:发送的消息内容 + 发送消息的配置信息

      int replyCode:状态码,发送成功是200

      String replyText:发送消息失败的描述信息

      String exchange:消息使用的交换机

      String routingKey:消息使用的路由键

        /**
         * A callback for returned messages.
         */
        @FunctionalInterface
        public interface ReturnCallback {
    
            /**
             * Returned message callback.
             * @param message the returned message.
             * @param replyCode the reply code.
             * @param replyText the reply text.
             * @param exchange the exchange.
             * @param routingKey the routing key.
             */
            void returnedMessage(Message message, int replyCode, String replyText,
                    String exchange, String routingKey);
        }

    2. 异常消息流程

    2.1 消息退回

      在消费者接收到消息之后,如果这个消息有问题,或者不是消费者想要的消息,可以把消息退回到原队列。退回原队列要确保有其他的服务可以再次消费这条消息。

      参数说明:

      long deliveryTag:消息唯一标识,这是RabbitMQ自动生成的,不需要人为管理,只需要从message.getMessageProperties().getDeliveryTag() 就可以获得。

      boolean multiple:是否批量退回,不开启就使用false,开启批量退回需要增加自己的业务判断逻辑(比如:攒够几条再批量回退,或者设置等待间隔等等)

      boolean requeue:是否退回到消息队列,退回就使用true,就是交给其他消费者处理。

        void basicNack(long deliveryTag, boolean multiple, boolean requeue) throws IOException;

    2.2 死信交换机

      死信交换机,顾名思义,就是不能再使用的消息,都会到这里来。其实谓死信交换机, 只是对应的队列设置了对应的交换机是死信交换机, 对于交换机来讲, 他还是一个普通的交换机 。

      一般进入死信交换机有3种情况:

    • 1. 消息被退回,又没有被退回到原队列。就是2.1中的requeue参数设置成false的情况。
    • 2. 当消息过期了。队列在创建时如果设置了消息过期时间,消息超过这个时间还没有被消息的情况。
    • 3. 消息超过队列容量。队列设置了最大长度、最大容量,如果超出容量存不下的情况。

      死信交换机的定义,在创建队列时,给队列指定它的死信交换机。

        @Bean
        public Queue queue() {
            Map<String,Object> map = new HashMap<>();
            //设置消息的过期时间 单位毫秒
            map.put("x-message-ttl",10000);
            //设置附带的死信交换机
            map.put("x-dead-letter-exchange","exchange.dlx");
            //指定重定向的路由建 消息作废之后可以决定需不需要更改他的路由建 如果需要 就在这里指定
            map.put("x-dead-letter-routing-key","dead.order");
            return new Queue("testQueue", true,false,false,map);
        }

      注意:这里的死信交换机名称“exchange.dlx”是要提前定义好的,并且绑定它自己的队列,否则会报错。

    3. RabbitMQ常用配置参数

    3.1 队列参数

    参数名

    配置作用

    x-dead-letter-exchange

    死信交换机

    x-dead-letter-routing-key

    死信消息重定向路由键

    x-expires

    队列在指定毫秒数后被删除

    x-ha-policy

    创建HA队列

    x-ha-nodes

    HA队列的分布节点

    x-max-length

    队列的最大消息数

    x-message-ttl

    毫秒为单位的消息过期时间,队列级别

    x-max-priority

    最大优先值为255的队列优先排序功能

    3.2 消息参数

    参数名

    配置作用

    content-type

    消息体的MIME类型,如application/json

    content-encoding

    消息的编码类型

    message-id

    消息的唯一性标识,由应用进行设置

    correlation-id

    一般用做关联消息的message-id,常用于消息的响应

    timestamp

    消息的创建时刻,整形,精确到秒

    其实我们刚刚发现所谓死信交换机,只是对应的队列设置了对应的交换机是死信交换机,对于交换机来讲,他还是一个普通的交换机

  • 相关阅读:
    淘宝首页性能优化实践
    Ubuntu16.04下搭建Go语言环境
    ubuntu下nvm,node以及npm的安装与使用
    idea 新建/导入的xml 报文头报错 URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)
    Spring Boot 请求返回字符串中文乱码
    Java 从FTP下载.上传文件
    Spring boot 定时器
    spring boot集成mybatis 自动生成实体类和mapper文件、Dao层
    Registered driver with driverClassName=oracle.jdbc.driver.OracleDriver was not found
    Oracle中创建序列
  • 原文地址:https://www.cnblogs.com/huanshilang/p/12704276.html
Copyright © 2020-2023  润新知