若有收获,请记得分享和转发哦
今天给大家整理分享一道面试题:“如何实现延时队列?”。
下边会介绍多种实现延时队列的思路,其实哪种方式都没有绝对的好与坏,只是看把它用在什么业务场景中,技术这东西没有最好的只有最合适的。
一、延时队列的应用
什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。
延时队列在项目中的应用还是比较多的,尤其像电商类平台:
1、订单成功后,在30分钟内没有支付,自动取消订单
2、外卖平台发送订餐通知,下单成功后60s给用户推送短信。
3、如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存
4、淘宝新建商户一个月内还没上传商品信息,将冻结商铺等
。。。。
上边的这些场景都可以应用延时队列解决。
二、延时队列的实现
我个人一直秉承的观点:工作上能用JDK
自带API
实现的功能,就不要轻易自己重复造轮子,或者引入三方中间件。一方面自己封装很容易出问题(大佬除外),再加上调试验证产生许多不必要的工作量;另一方面一旦接入三方的中间件就会让系统复杂度成倍的增加,维护成本也大大的增加。
order2 10s 后执行
总结
为了让大家更容易理解,上边的代码写的都比较简单粗糙,几种实现方式的demo
已经都提交到github
地址:https://github.com/chengxy-nds/delayqueue
,感兴趣的小伙伴可以下载跑一跑。
这篇文章肝了挺长时间,写作一点也不比上班干活轻松,查证资料反复验证demo的可行性,搭建各种RabbitMQ
、Redis
环境,只想说我太难了!
可能写的有不够完善的地方,如哪里有错误或者不明了的,欢迎大家踊跃指正!!!