简单快速实现定时调度的解决方案(简单快速实现定时调度的解决方案有哪些)
业务场景:
1)流程协作平台任务过期前需要提醒。到期前5小时提醒一次,2小时前提醒一次,30分钟前提醒一次。
2)电商网站的订单下单以后,2小时内未付款需要关闭。
常见的解决方案:
1)将业务类型,执行时间存储到数据库,通过定时扫描数据库来处理。
2)针对每一个任务设置一个timer来定时执行。
以上方案的缺点:
1)低效,被动,难控制时间的准确度。
2)业务如果爆发,譬如每天10w笔订单创建,设置10w个线程是不可接受的。
3)系统重启恢复定时任务需要消耗大量资源。
当然也有优点:简单粗暴。
推荐解决方案:
nginx作为应用服务器,以高效,低资源消耗占有了很大一块市场份额。当nginx面临大量http请求,每个请求都需要超时控制的时候(后端无响应),nginx是如何处理的呢?
直接看图:
重要功能点说明:
1)对需要超时处理的先做排序,最近执行的放在最上面,避免循环遍历。
2)for循环中通过设置预期超时事件,到点再唤醒,减少cpu占用。
3)占用线程数量最小。只需要一个线程处理所有超时事件。
4)超时处理时间准确度可控制。
有了模型,很快可以用java语言实现一套适用于自己业务系统的超时控制中心,先看模型图。
核心功能:
1)维护一个超时队列,可通过TreeSet实现。
2)实现注册超时事件和注销超时事件这两个接口。
3)维护超时事件类型以及对应的处理业务处理器。
4)主线程负责获取最近超时事件,执行业务处理器,回调执行下一个超时任务。
代码这里就不贴了,有兴趣的同学可以看git上的源码:
https://git.oschina.net/guda/timeout.git
================================
互联网技术知识、资源分享
欢迎通过微信公众号:扣钉有道,留言与作者沟通。