第三十一章 下单接口-超时关闭订单功能设计+延迟队列实战
第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条)