# timeout **Repository Path**: guda/timeout ## Basic Information - **Project Name**: timeout - **Description**: 超时处理中心 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 1 - **Created**: 2016-07-06 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 我们先看看业务场景:
1)流程协作平台任务过期前需要提醒。到期前5小时提醒一次,2小时前提醒一次,30分钟前提醒一次。
2)电商网站的订单下单以后,2小时内未付款需要关闭。

常见的解决方案:
1)将业务类型,执行时间存储到数据库,通过定时扫描数据库来处理
2)针对每一个任务设置一个timer来定时执行。

以上方案的缺点:
1)低效,被动,难控制时间的准确度。
2)业务如果爆发,譬如每天10w笔订单创建,设置10w个线程是不可接受的。
3)系统重启恢复定时任务需要消耗大量资源。
当然也有优点:简单粗暴。

nginx作为应用服务器,以高效,低资源消耗占有了很大一块市场份额。当nginx面临大量http请求,每个请求都需要超时控制的时候(后端无响应),nginx是如何处理的呢?直接看图:
![输入图片说明](http://git.oschina.net/uploads/images/2016/0706/204518_b7304425_129280.jpeg "在这里输入图片标题")
重要功能点说明:
1)对需要超时处理的先做排序,最近执行的放在最上面,避免循环遍历
2)for循环中通过设置预期超时事件,到点再唤醒,减少cpu占用
2)占用线程数量最小。只需要一个线程处理所有超时事件
3)超时处理时间准确度可控制

有了模型,很快我也也可以用java语言实现一套适用于自己业务系统的超时控制中心,先看看模型
![输入图片说明](http://git.oschina.net/uploads/images/2016/0706/204541_c3bdebcc_129280.jpeg "在这里输入图片标题")
核心功能:
1)维护一个超时队列,可通过TreeSet实现
2)实现注册超时事件和注销超时事件这两个接口
3)维护超时事件类型以及对应的处理业务处理器
4)主线程负责获取最近超时事件,执行业务处理器,回调执行下一个超时任务。

有兴趣的同学可以看git上的源码:https://git.oschina.net/guda/timeout.git 后续可优化的点:
1)集群环境多台超时中心同时处理的问题。
2)超时任务逻辑分组
3)超时任务持久化,应用重启需要恢复