文档章节

基于时间轮的任务超时控制

zhangwei_2943
 zhangwei_2943
发布于 2015/01/20 17:46
字数 509
阅读 144
收藏 1

    平时我们在写程序的时候很多情况下都会遇到任务超时处理的业务情况(比如说调用一个后台的api接口如果超过5秒没有返回数据就出发超时的业务逻辑),针对这种业务平时我们都是使用一个线程+timer来实现。

这个实现方式本身是没有问题的,但是如果遇到同时又N多个需要处理超时的业务函数,这种情况下如果还给每个超时都用一个线程来控制势必会降低很多性能

    这里提出了一个新的概念《基于时间轮算法》来控制任务超时,可以将这个算法简单的理解为时钟,在时钟的每一个格子里面添加一个任务队列,任务队列里面是相应的超时任务.秒表会每隔固定的时间转动一次时间轮,

当秒表执行的格子里面有超时任务存在时就执行这个超时任务(通过这种方式就可以实现 一个线程控制多个超时任务)极大的提升了系统效率。

    时间轮算法可以通过下面这张图来分析具体逻辑

   

时钟可以分为 秒针/分针/时针,以最小单位作为时间轮的运行轨迹,在添加任务的时候根据最小单位和超时时间计算出 时间轮的 周期+卡槽位置,时间轮在跳转的时候每次都会检查卡槽是否有超时任务队列存在,如果有在判断 周期是否满足,如果都满足条件则出发 超时执行。

下面这个代码库 就是用go写的一个具体实现,已经在生产环境稳定运行,有需要的朋友可以直接使用

https://github.com/zhangwei1234/go-timer-wheel.git


© 著作权归作者所有

共有 人打赏支持
zhangwei_2943
粉丝 0
博文 3
码字总数 1832
作品 0
成都
架构师
私信 提问
Timer 源码解读[连载2]

转自: https://github.com/yjhjstz/deep-into-node Timer源码解读 涉及源码 lib/timers.js src/timerwrap.cc deps/uv/src/unix/timer.c deps/uv/src/heap-inl.h 主要分为 javascript 层面的......

_朴灵_
05/14
0
0
C基础库--libfastcommon

libfastcommon是一款开源的C基础库,她是从FastDFS项目中剥离出来的C基础库。这个库非常简单、高效和稳定,提供的函数主要包括如下几类: string:字符串处理; logger:日志记录,支持日志轮...

fastdfs
2017/03/08
412
0
分布式计划任务设计与实现

分布式计划任务设计与实现 http://netkiller.github.io/journal/scheduler.html 版权 © 2014 http://netkiller.github.io 2014-09-30 目录 1. 什么是分布式计划任务 2. 为什么采用分布式计划...

neo-chen
2014/09/30
2.6K
3
用Erlang实现Time Wheel

游戏开发总会要用到timer,离不开定时器的使用。像界面需要定时去绘制更新界面,后端也需要来定时执行逻辑,驱动事件。条条道路通罗马,就看你使用技巧好不好了。 一般服务器都是10ms一个tic...

rongtou
2016/12/27
41
0
Eureka的TimedSupervisorTask类(自动调节间隔的周期性任务)

版权声明:欢迎转载,请注明出处,谢谢。 https://blog.csdn.net/boling_cavalry/article/details/82795825 起因 一个基于Spring Cloud框架的应用,如果注册到了Eureka server,那么它就会定...

博陵精骑
09/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

云环境所面临的安全威胁

导读 为了云计算的健康发展和等级保护工作在新形势下顺利推进,就不能忽视对云计算面临的各类安全威胁的研究和分析,并制定和建立相应的等级保护政策、技术体系,应对即将到来的云浪潮。 为了...

问题终结者
30分钟前
0
0
大牛五分钟教你如何创建并运行java线程

Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。 可以用如下方式用java中创建一个线程: 执行该线程可以调用该线程的start()方法: 在上面的例子中,我们并没有为线程...

java知识分子
31分钟前
0
0
监控某进程工作状态的脚本

很多时候,我们需要监控某个脚本是否正在执行,如果不在执行,则需将它重启。 思路: 监测脚本或进程的执行状态,可以通过ps -ef,再加上grep命令进行定位。 如果该进程在执行,则上述命令会...

vinci321
32分钟前
0
0
彻底弃用PHP转入Kotlin阵营

痛定思痛,决定彻底弃用PHP,转入Kotlin,采用Ktor方案。Kotlin从去年年底到现在,我都一直保持关注,这一年下来,从1.0升级到1.3,增加了很多特性和支持。其实,只要是JetBrains扶持着的,想...

曾建凯
36分钟前
0
0
php动态扩展模块安装

11月21日任务 11.32 php扩展模块装安装 1.PHP扩展模块安装 示例一:编译安装一个扩展模块 /usr/local/php/bin/php -m //查看模块 下面安装一个redis的模块 cd /usr/local/src/ 进入该目录下 ...

hhpuppy
40分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部