订单自动确认或取消设计方案

    前不见古人,后不见来者。念天地之悠悠,独怆然而涕下。

简介

系统订单自动确认或取消的设计方案,最常见的一个业务比如N天后自动确认订单,达到动态修改订单状态的目的。大多数项目采用的都是如下两种方案。

上面方两种传统解决方案会降低了系统的整体性能和吞吐量,往往不够支持庞大的系统如京东、天猫、亚马逊或者12306等系统。这时可以考虑采用MQ,平时MQ用的较多的就是业务解耦、前端削峰(秒杀系统)、高可用性和顺序消息。除此之外,RabbitMQ还支持定时消息和延迟消息,Broker中有定时消息的机制,消息发送到Broker中,不会立即被Consumer消费,会等到一定的时间才被消费。延迟消息也是一样,延迟一定时间之后才会被Consumer消费。

体系较为庞大的项目一般会采用RabbitMQ的消息延迟消推送来实现。

消息延迟推送的实现

首先按照常规的手段创建交换机和消息队列,配置生产者和消费者等基础信息。不同的是,在 Exchange 的声明中设置exchange.setDelayed(true)来开启延迟队列。

 exchange.setDelayed(true)

或设置交换机支持延迟队列推送。

1     @Bean
2     public TopicExchange lazyExchange(){
3         //Map<String, Object> pros = new HashMap<>();
4         //设置交换机支持延迟消息推送
5         //pros.put("x-delayed-message", "topic");
6         TopicExchange exchange = new TopicExchange(LAZY_EXCHANGE, true, false, pros);
7         exchange.setDelayed(true);
8         return exchange;
9     }

然后,发送消息时指定延迟推送的时间就可以实现消息延迟推送了。

1   public Message postProcessMessage(Message message) throws AmqpException {
2                 //设置消息持久化
3                 message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
4                 //message.getMessageProperties().setHeader("x-delay", "6000");
5                 message.getMessageProperties().setDelay(6000);  // 指定延迟推送的时间
6       return message; 7 }
前不见古人
    后不见来者
          念天地之悠悠
               独怆然而涕下

发表回复