分布式可靠延时任务实现方案

本文探讨了如何实现可靠执行的定时任务和延时任务,强调任务持久化的重要性,如使用数据库或消息队列。针对单机和分布式场景,提出了包括数据库扫库、Redis有序集合、消息队列的延时消息等多种解决方案,并讨论了幂等性和任务执行成功的保障措施,如分布式锁和Zookeeper选举。此外,还介绍了小根堆和时间轮算法等延时算法的实现思路。
摘要由CSDN通过智能技术生成

定时任务&延时任务

可以理解定时任务是延时任务的周期执行形式

方案

  1. 轮询
  2. Java DelayQue(小根堆)
  3. netty时间轮算法
  4. redis有序集合
  5. redis key过期通知(发布订阅)
  6. 消息队列的延时消息

思考:单机&分布式
现在有一个延时任务,要想实现可靠执行,必须将任务持久化,比如数据库或者消息队列,数据库扫库或者消息队列的延时消息。如果是定时任务。因为执行完成后要重新设置任务下一次执行时间,如果是数据库,就经历扫库->查询每一条任务,当前任务现在可以执行,执行完成后修改任务下一次的执行时间。如果是单线程,可以不考虑幂等问题,但如果是多线程或者分布式,那可能会出现多个线程同时拿到同一个任务执行,执行完成后设置任务的下一次执行时间,需要确保任务的幂等和任务的执行成功,比如A线程拿到任务1后,执行,但机器宕机了,需要下一个线程接上,B线程继续执行,如果B线程也因为意外退出了或者还没来得及更新任务的下一次执行时间退出了,其他线程需要接上,实现方案是分布式锁或者zk选举,拿到锁的线程才能执行任务。数据库实现起来成本太大,有其他的方案大家可以交流一下

思考:延时算法
类似Java DelayQue的小根堆,netty的时间轮算法,最简单是轮询判断。

小根堆实现
现在有一个数据结构,维护一组任务,任务有创建时间和延时时间属性,这个数据结构支持动态添加任务,会按照下一次执行的时间进行排序,很容易想到用堆,堆支持动态添加元素,动态获取当前最小/最大的元素,每次拿出当前最小的元素,如果当前最小的元素可以执行,那就执行,不可以执行那就睡眠一段时间,如果有新的任务添加进来,那就提前唤醒睡眠的线程,重新按从小到大的顺序维护小根堆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值