RabbitMQ延时队列及消息可靠性

RabbitMQ延时队列及消息可靠性

延时队列

场景
 在电商项目中订单环节,未支付15分钟关闭订单、订单成功支付需要调用许多服务(商品扣减、日志记录...)等保证最终一致性、发起退款一段时间没操作通知相关人员等,需要在一定的时间倒计时后消费。
 这样场景可以设置定时器轮询数据库状态、修改状态 这种方法是可行但是效率太低,反复操作数据库增加IO。
MQ延迟消费场景则可以应对
介绍
 MQ高级特性TTL,它可以是一个队列或者一个消息的属性,指在这个队列中所有消息最大存活时间或者单个消息的最大存活时间,单位毫秒,在最大存活时间范围内,如果消费没被消费就会路由到死信队列。
 死信对列-当消息到底,代码中就可以设置监听队列,有消息立即执行逻辑。当普通队列消息在最大时间内未被消费,路由到对应死信队列,被监听者处理,那么这个过程就称延时方式。联想场景:未支付15分钟关闭订单 就可以不用定时器实现。
实现方案
1.声明订单队列、订单交换机、绑定订单交换机关系,死信订单交换机、死信交换机,订单队列绑定死信交换机及队列
//声明MQ队列、交换机
@Configuration
public class RabbitMqConfig {
   
    //订单队列交换机
    private static final String ORDER_EXCHANGE="order_exchange";
    //订单队列
    private static final String ORDER_QUEUE="order_queue";
    //路由key 带通配符 以order. 开头命中
    private static final String ORDER_ROUTINGKEY="order.#";


    //订单死信交换机
    private static final String DLX_ORDER_EXCHANGE="dlx_order_exchange";
    //订单死信对列
    private static final String DLX_ORDER_QUEUE="dlx_order_queue";
    //路由Key
    private static final String DLX_ROUTINGKEY="dlxOrder";

    //订单异常交换机
    private static final String EXCEPTION_ORDER_EXCHANGE="exception_order_exchange";
    //订单异常队列
    private static final String EXCEPTION_ORDER_QUEUE="exception_order_queue";
    //订单异常路由Key
    private static final String EXCEPTION_ROUTINGKEY="exceptionOrder";




    //订单交换机
    @Bean(RabbitMqConfig.ORDER_EXCHANGE)
    public TopicExchange orderExchange(){
   
        //durable持久化交换机 topic模式
        return ExchangeBuilder.topicExchange(RabbitMqConfig.ORDER_EXCHANGE).durable(true).build();
    }

    //订单队列
    @Bean(RabbitMqConfig.ORDER_QUEUE)
    

你可能感兴趣的:(middle,rabbitmq,java)