淘宝七天自动确认收货,怎么设计?RabbitMQ延迟队列,消息延迟推送delayed_me。。。

更新时间:2023-06-11 16:04:38 阅读: 评论:0

淘宝七天⾃动确认收货,怎么设计?RabbitMQ延迟队列,消
hero是什么意思息延迟推送delayed_me。。。
#淘宝七天⾃动确认收货,让你实现,怎么设计?
⽬前⾮常多应⽤软件都有消息延迟推送的需求,例如:
淘宝购物在我们签收商品后,如不点击收货确认,系统会在七天后⾃动确认收货,并通知⽀付系统打款给商家,这个过程持续七天。
labor
物联⽹系统定时向终端下发命令,如果⼀段时间没有应答,就需要将终端设置为超时。
2009年好看的电影12306购票⽀付确认页⾯。我们选好票点击确认跳转到⽀付页⾯,倒计时30分钟如果不⽀付则会⾃动取消订单。其实在下单的那⼀刻系统就发送⼀个延时消息,时效30分钟,如果30分钟内⽀付订单,则不取消订单,如没有⽀付,则取消订单。
上述场景,如使⽤传统⽅法,⽆疑将⼤⼤降低系统整体性能和吞吐量:
使⽤传统数据库轮询来判断数据库表中订单状态,这⼤⼤增加IO次数,性能极低。
使⽤Redis给订单设置过期时间,最后判断Redis中是否还有该订单来决定订单是否⽣效。这种解决⽅案⽐数据库轮询效率⾼,但低于消息延迟推送,因为Redis存储于内存中,数据量较⼤、恶意刷单等情况会给系统带来巨⼤冲击。
使⽤JVM原⽣DelayQueue,同样会占⽤⼤量内存,且没有持久化策略,⼀旦重启或宕机,则数据丢失。
#RabbitMQ延迟队列实现消息延迟推送功能
RabbitMQ3.6前可采⽤死信队列+TTL。
RabbitMQ3.6后,官⽅提供了rabbitmq_delayed_message_exchange延迟队列插件,本⽂采取这种⽅式。
#Rabbitmq_delayed_message_exchange插件下载安装
RabbitMQ插件放到根⽬录的plugins⽂件夹下,如D:\Program Files\RabbitMQ\rabbitmq_rver-3.9.5\plugins。
①将rabbitmq_delayed_message_exchange-3.下载到plugins⽂件夹下,安装后也不能删除。
官⽅下载地址:
② 双击RabbitMQ Command Prompt (sbin dir)或CMD到RabbitMQ的sbin⽬录中,输⼊rabbitmq-plugins enable
rabbitmq_delayed_message_exchange安装延时队列插件。
#RabbitMQ消息延迟推送delayed_message代码实现
①Maven依赖及application.propertie基础配置可参考上⼀篇⽂章:
②配置消息延迟队列,在TopicExchange交换机声明中设置exchange.tDelayed(true)来开启延迟队列。
ample.demohelloworld.RabbitMq.Lazy;
import org.Binding;
import org.BindingBuilder;
import org.Queue;
import org.TopicExchange;
import t.annotation.Bean;
import t.annotation.Configuration;
simple
@Configuration
public class RabbitLazyConfig {
public final static String lazyname="my-lazyname";
@Bean
TopicExchange topicExchangeLazy(){
西式早餐
TopicExchange exchange= new TopicExchange(lazyname,true,fal);
exchange.tDelayed(true);//开启延时队列
return exchange;
}
@Bean
the hostQueue queueLazy(){
return new Queue("lazy");
}
@Bean
Binding bindingLazy(){
return BindingBuilder.bind(queueLazy())
.to(topicExchangeLazy())
.with("lazy.#");
深圳嵌入式培训}
}
也可以声明通⽤交换机CustomExchange,type类型为x-delayed-message,消息类型args设置为("x-delayed-type","topic")来开启延迟队列。tDelayed(true)底层也是通过这种⽅式来实现的。TopicExchange和CustomExchange两种⽅式⼆选⼀,源码参考如下:
@Bean
CustomExchange customExchange() {
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "topic");
return new CustomExchange(lazyname,"x-delayed-message", true, fal, args);
}
@Bean
Queue queueLazy(){
return new Queue("lazy");
学英语有什么用}
@Bean
BindingBuilder.GenericArgumentsConfigurer binding() {
return BindingBuilder.bind(queueLazy())
.to(customExchange())
.
with("lazy.#");
}
③配置消息消费端,因为是精简代码,所以暂时不含有Confirm和Returns监听,如需要可参看上⼀篇⽂章。我们配置⼀个"lazy"队列监听,指定⼀个消息消费⽅法logger⽇志输出,将所接收到的消息内容在后台输出(⽣产环境中则为具体执⾏的业务逻辑,⽐如淘宝订单消息消费逻辑,⾃动确认收货;12306订单消息消费逻辑,关闭订单)。
ample.demohelloworld.RabbitMq.Lazy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;价值观 英语
import org.springframework.stereotype.Component;
unfortunatelyimport java.io.IOException;
@Component
public class RabbitLazyService {
Logger logger= Class());
@RabbitListener(queues = "lazy")
public void Handler(Message message)throws IOException{
logger.info("LazyReceiverHandler:"+ new Body()));
}
}
④配置实现类来模拟5秒钟后执⾏延迟队列,CorrelationData是传⼊⽅法执⾏时的时间戳,声明消息处理类MessagePostProcessor是通过Message->对象的Header属性来设置消息延迟时间,这⾥我们采⽤了lamda写法,tHeader("x-delay",5000)表明这是⼀个延迟推送队列,时间为5秒。
ample.demohelloworld.RabbitMq.Lazy;
import org.MessagePostProcessor;
import org.springframework.tion.CorrelationData;
import org.springframework.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@RestController
public class RabbitLazyController {
@Autowired
RabbitTemplate rabbitTemplate;
@GetMapping("/lazy")
public void lazy(){
CorrelationData correlationData=new CorrelationData("12345678909"+new Date());
MessagePostProcessor messagePostProcessor= message -> {
return message;
};
}
}
#总结
回到最开始的问题,当我们在淘宝下单签收商品后,⽴即⽣成时间为七天的延时消息队列,在这七天内,如果不点击收货确认,系统会在七天后⾃动推送消息使订单确认收货并通知⽀付系统打款给商家,如已经点击收货确认,则该延时消息队列失效。

本文发布于:2023-06-11 16:04:38,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/141481.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:消息   队列   订单   延迟   系统   确认   推送   收货
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图