1. 什么是延迟任务?
延迟任务是当我们提交一件事情后,在未来的某个时间点自动执行另外一件事情。
例如:12306购票系统,当我选择购买一张火车票后,点击下单,在没有付款的情况下,30分钟后会自动取消订单。
2. 延迟任务的实现方式
- 使用JVM的DelayQueue
- 使用MQ(RabbitMQ的TTL+死信交换机)
- 使用Redis
3. 方式3实现思路
创建一个专门存储延迟任务的表
表结构如下:future_task(future_id,execute_time,parameters,priority,type)为什么这样设计?
考虑到通用性(即延迟任务服务化)提交一个任务后,首先存储到数据库MySQL的future_task表中,做一个持久化操作
根据这件任务的 执行时间 <= 当前时间
- 如果成立,就代表这个任务的已经可以开始执行,将其放入 Redis 中的 消费任务队列 队列 List
- 否则,就代表这个任务还没到执行时间,就以执行时间为 score 以这个任务为对象,存入 Redis 中的 延迟任务队列 ZSet
- 但是为了考虑 性能 ,ZSet中不能存储大量的数据,因此在存入ZSet之前,设置一个阈值,即任务的执行时间在未来5分钟之内
- 如果执行时间超过5分钟,就先将任务存放到数据库MySQL
- 那超过5分钟的数据被存储到MySQL中后,该怎么同步到 ZSet呢,需要一个定时任务作为同步器,定期扫描MySQL中任务的执行时间是否在未来5分钟之内,如果是,就将其同步到ZSet中
后面设置一个定时任务 去 ZSet 延迟任务队列 去根据 执行时间 是否小于当前时间,如果是,就将其从ZSet 中移除,放入 消费任务队列List中,等待消费
消费任务,从 消费任务队列 List进行消费