前言
艺术来源于生活,技术来源于业务,由于原业务上的需求,需要做一个用户下单后超过一定时间内没有支付自动取消订单,说白了就是一个超时自动取消的功能,这种场景恐怕是非常非常常见的一个业务需求了,在此记录下使用redis来实现此功能。
业务分析
当产品经理说到超时取消时,第一时间想到的就是延迟队列,市面上也有很多常见的消息中间件,例如:RabbitMQ,RocketMQ,ActiveMQ,Kafka,Redis,ZeroMQ等等,都可以实现此功能,虽然轮子不断造,但合适自己的才是最好的。
技术选型
1、RabbitMQ:一开始选中的就是它,它有一个实现延迟队列的插件,正好符合要求,但后来和技术经理沟通下,由于自身服务架构来说,此方法最终被石沉大海了,此方案被pass掉。
2、Redis:第二个方案是基于Redis,使用Redis的key过期通知,在服务端捕获这个失效通知来处理业务,一开始是可行的,但后来考虑到高可用,而且当接收通知的服务宕机时,就会出现掉单,丢失消息的情况,于是此方法也被Pass掉。
3、Redis+Redisson:经过几次考虑与测试后,最终使用了此技术来实现超时订单取消的功能开发。
技术介绍
Redisson:Redisson在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势,在Java实用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。
中文文档:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95
代码示例
pom.xml依赖
1 | <dependency> |
Redisson的配置类:
1 |
|
伪下单代码
1 |
|
处理超时订单代码
1 |
|
高可用配置
1 |
|
1 |
|
1 | /** |
运行截图
访问hello接口后,等待10秒,控制台返回如下
结言
还是那句话,技术类型越来越多,轮子不停造,选对技术合适自己业务的才是最好的,无论是JDK内置的延迟队列还是基于时间轮算法的队列,都无法保证生产系统的高可用性,而Redisson很好的解决了这个问题。