# 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是如何处理的呢?直接看图:

重要功能点说明:
1)对需要超时处理的先做排序,最近执行的放在最上面,避免循环遍历
2)for循环中通过设置预期超时事件,到点再唤醒,减少cpu占用
2)占用线程数量最小。只需要一个线程处理所有超时事件
3)超时处理时间准确度可控制
有了模型,很快我也也可以用java语言实现一套适用于自己业务系统的超时控制中心,先看看模型

核心功能:
1)维护一个超时队列,可通过TreeSet实现
2)实现注册超时事件和注销超时事件这两个接口
3)维护超时事件类型以及对应的处理业务处理器
4)主线程负责获取最近超时事件,执行业务处理器,回调执行下一个超时任务。
有兴趣的同学可以看git上的源码:https://git.oschina.net/guda/timeout.git
后续可优化的点:
1)集群环境多台超时中心同时处理的问题。
2)超时任务逻辑分组
3)超时任务持久化,应用重启需要恢复