面试官问:淘宝七天自动确认收货,让你设计,可以怎么实现?

时间:2021-09-13来源:栏目:互联网

每天学习一点Java面试笔试和Java技术。作者:向海。来源:https://www.cnblogs.com/haixiang/目前常见的应用软件都有延迟消息推送的影子,应用广泛,如:淘宝七天自动确认收货。我们...

每天学习一点Java面试笔试和Java技术。

作者:向海。

来源:https://www.cnblogs.com/haixiang/

目前常见的应用软件都有延迟消息推送的影子,应用广泛,如:

淘宝七天自动确认收货。我们签收货物后,七天后物流系统会给支付系统发消息,通知支付系统把钱发给商家。这个过程持续七天,意味着使用了消息中间件的延时推送功能。

12306购票付款确认页面。我们经常会在点击OK跳转的页面上有一个倒计时,这意味着如果30分钟内没有确认订单,订单就会自动取消。其实在下单的那一刻,购票业务系统就会向订单系统发送延迟消息,延迟30分钟,告诉订单系统订单还没有完成。如果我们在30分钟内完成订单,我们可以通过逻辑代码判断忽略收到的消息。

在以上两种场景中,如果我们使用以下两种传统解决方案,无疑会大大降低系统的整体性能和吞吐量:

使用redis设置订单的到期时间,最后通过判断redis中是否还有订单来判断订单是否已经完成。与消息的延迟推送相比,这种解决方案的性能更低,因为我们知道redis都存储在内存中,当我们遇到恶意的订单或账单时,会给内存带来很大的压力。

传统的数据库轮询是用来判断数据库表中订单的状态,这无疑增加了IO的数量,性能极低。

使用jvm的原生DelayQueue也会占用大量内存,如果没有持久化策略,系统在停机或重启时会丢失订单信息。

延迟消息推送的实现。

在rabbtmq 3 . 6 . x之前,我们一般使用死信队列的TTL到期时间来实现延迟排队,这里就不多介绍了。

在RabbitMQ 3.6.x之初,rabbtmq正式提供了延迟队列的插件,可以下载并放置在rabbtmq根目录下的plugins下。

首先,我们创建开关和消息队列,application.properties中的配置与上一篇文章中的配置相同。

我们可以在Exchange的语句中设置打开延迟队列,或者设置以下内容引入switch的语句的方法中,因为第一种方式的底层就是这样实现的。

发送消息时,我们需要指定延迟推送的时间。这里,我们在发送消息的方法中传递参数,以便获得对象,因为我们需要借助对象的api来设置延迟时间。

我们可以观察底层代码,并在报头中设置x延迟。相当于手动设置表头。

消费端消费。

果然,6秒后我收到了消息。

1.本站部分来源于互联网用户自主整合上传,如有侵权,请联系我们删除;

2.文章内容并不代表本站的观点或立场,如有关于文章内容,版权或其它问题请联系删除;

3.本文地址:https://jiatu888.com/hlw/83682.html

java 面试官 淘宝

最新文章

网站介绍

本站部分内容收集于互联网,如有侵犯贵司(个人)版权,请联系本站删除。

Copyright@2018-2021 www.jiatu888.com 嘉图网 All Rights Reserved 粤ICP备20051635号 网站地图 tag列表

嘉图网