海量数据处理商用短链接生成器平台 - 11

第三十一章 下单接口-超时关闭订单功能设计+延迟队列实战 第1集 订单模块下单接口-支付超时订单链路设计 简介:订单模块下单接口-支付超时订单链路设计 需求背景 原因一:第三方支付平台的支付连接都是有时效性,创建订单后,需要再一定的时间

第三十一章 下单接口-超时关闭订单功能设计+延迟队列实战

第1集 订单模块下单接口-支付超时订单链路设计

简介:订单模块下单接口-支付超时订单链路设计

  • 需求背景

    • 原因一:第三方支付平台的支付连接都是有时效性,创建订单后,需要再一定的时间内支付完成
      • 微信支付、支付宝支付等
      • 也可以不关闭订单,做订单二次支付的操作,但业务链路会更加复杂
    • 原因二:电商业务里面还会涉及到商品库存的锁定和释放
  • 所以多数订单业务都是会有这个功能,那如何设计呢?

第2集 RabbitMQ死信队列-延迟消息知识点回顾

简介:RabbitMQ死信队列-延迟消息知识点回顾

  • 什么是rabbitmq的死信队列
    • 没有被及时消费的消息存放的队列
  • 什么是rabbitmq的死信交换机
    • Dead Letter Exchange(死信交换机,缩写:DLX)当消息成为死信后,会被重新发送到另一个交换机,这个交换机就是DLX死信交换机。

  • 消息有哪几种情况成为死信

    • 消费者拒收消息**(basic.reject/ basic.nack)**,并且没有重新入队 requeue=false
    • 消息在队列中未被消费,且超过队列或者消息本身的过期时间TTL(time-to-live)
    • 队列的消息长度达到极限
    • 结果:消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列
  • 什么是延迟队列

    • 一种带有延迟功能的消息队列,Producer 将消息发送到消息队列 服务端,但并不期望这条消息立马投递,而是推迟到在当前时间点之后的某一个时间投递到 Consumer 进行消费,该消息即定时消息
  • 业界的一些实现方式

    • 定时任务高精度轮训
    • 采用RocketMQ自带延迟消息功能
    • RabbitMQ本身是不支持延迟队列的,怎么办?
      • 结合死信队列的特性,就可以做到延迟消息
第3集 超时关单-RabbitMQ实现延迟消息配置实战

简介:超时关单-RabbitMQ实现延迟消息配置实战

  • 数据流转

  • 死信队列配置
/**
 *
 *
 * 自定义消息队列配置,
 * 发送 关单消息-》延迟exchange-》order.close.delay.queue-》死信exchange-》order.close.queue
 *
 * @Description
 * @Author
 * @Remark 
 * @Version 1.0
 **/
@Configuration
@Data
public class RabbitMQConfig {
   
   




    /**
     * 交换机
     */
    private String orderEventExchange="order.event.exchange";




    /**
     * 延迟队列, 不能被监听消费
     */
    private String orderCloseDelayQueue="order.close.delay.queue";


    /**
     * 关单队列, 延迟队列的消息过期后转发的队列,被消费者监听
     */
    private String orderCloseQueue="order.close.queue";




    /**
     * 进入延迟队列的路由key
     */
    private String orderCloseDelayRoutingKey="order.close.delay.routing.key";




    /**
     * 进入死信队列的路由key,消息过期进入死信队列的key
     */
    private String orderCloseRoutingKey="order.close.routing.key";


    /**
     * 过期时间 毫秒,临时改为1分钟定时关单
     */
    private Integer ttl=1000*60;


    /**
     * 消息转换器
     * @return
     */
    @Bean
    public MessageConverter messageConverter(){
   
   
        return new Jackson2JsonMessageConverter();
    }




    /**
     * 创建交换机 Topic类型,也可以用dirct路由
     * 一般一个微服务一个交换机
     * @return
     */
    @Bean
    public Exchange orderEventExchange(){
   
   
        return new TopicExchange(orderEventExchange,true,false);
    }




    /**
     * 延迟队列
     */
    @Bean
    public Queue orderCloseDelayQueue(){
   
   


        Map<String,Object> args = new HashMap<>(3);
        args.put("x-dead-letter-exchange",orderEventExchange);
        args.put("x-dead-letter-routing-key",orderCloseRoutingKey);
        args.put("x-message-ttl",ttl);


        return new Queue(orderCloseDelayQueue,true,false,false,args);
    }




    /**
     * 死信队列,普通队列,用于被监听
     */
    @Bean
    public Queue orderCloseQueue(){
   
   


        return new Queue(orderCloseQueue,true,false,false);


    }


    /**
     * 第一个队列,即延迟队列的绑定关系建立
     * @return
     */
    @Bean
    public Binding orderCloseDelayBinding(){
   
   


        return new Binding(orderCloseDelayQueue,Binding.DestinationType.QUEUE,orderEventExchange,orderCloseDelayRoutingKey,null);
    }


    /**
     * 死信队列绑定关系建立
     * @return
     */
    @Bean
    public Binding orderCloseBinding(){
   
   


        return new Binding(orderCloseQueue,Binding.DestinationType.QUEUE,orderEventExchange,orderCloseRoutingKey,null);
    }






}


第4集 下单接口-发送延迟消息链路测试和Bug修复

简介:下单接口-发送延迟消息链路测试和Bug修复

  • 下单接口发送延迟消息
 //发送延迟消息


EventMessage eventMessage = EventMessage.builder()
                .eventMessageType(EventMessageType.RPODUCT_ORDER_NEW.name())
                .accountNo(loginUser.getAccountNo())
                .bizId(orderOutTradeNo).build();
        rabbitTemplate.

发布者:admin,转转请注明出处:http://www.yc00.com/web/1754767911a5199762.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信