分层时间轮的实现 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
IIInsomnia
V2EX    Go 编程语言

分层时间轮的实现

  •  
  •   IIInsomnia
    shenghui0779 90 天前 3202 次点击
    这是一个创建于 90 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一直找不到合适的 Go 时间轮库,正好工作需要,就自己实现了一个

    https://github.com/noble-gase/xe/tree/main/timewheel

    22 条回复    2025-09-02 09:44:36 +08:00
    aliipay
        1
    aliipay  
       90 天前
    想知道多个 Level 时候,最上层 level 到期后(比如 23 点 59 分 59 秒),大量任务需要重新分配 bucket ,如何保证系统平稳呢?
    momowei
        2
    momowei  
       90 天前   1
    时间轮主要用来解决啥问题
    phatzhong24
        3
    phatzhong24  
       90 天前
    @momowei #2 定时任务?
    midsolo
        4
    midsolo  
       90 天前   2
    以前为了完成 KPI ,在公司手撸了一个时间轮
    sngxx
        5
    sngxx  
       90 天前
    @dlmy 图画得好啊,怎么学的
    midsolo
        6
    midsolo  
       90 天前
    @sngxx 用了 4 年 DDD ,画了 8000 多张图,纯手撸练出来的
    yianing
        7
    yianing  
       90 天前   1
    @momowei 延时队列
    NoKey
        8
    NoKey  
       90 天前
    @dlmy 你这个是什么工具画的啊
    nobot
        9
    nobot  
       90 天前
    这个不是顺手就来的吗?没个项目中都要收录一个,C++版,go 版,C#版,php 版
    midsolo
        10
    midsolo  
       90 天前
    BBCCBB
        11
    BBCCBB  
       90 天前
    看 kafka 的源码, 2, 300 行代码就能撸一个出来.
    lazydog
        12
    lazydog  
       90 天前
    @dlmy #4 太牛了
    IIInsomnia
        13
    IIInsomnia  
    OP
       89 天前
    @aliipay 每次到点,都是将目标槽位的链表摘下,换一个新的上去;异步处理摘下的链表中的任务,互不影响
    aliipay
        14
    aliipay  
    nbsp;  89 天前
    @IIInsomnia 如果任务数量巨大,怎么保证能在一个最小定时间隔周期内完成呢,如果完不成就可能会导致任务丢失或者推迟到下一个分层完成
    IIInsomnia
        15
    IIInsomnia  
    OP
       89 天前
    @aliipay 并发执行的,每个任务的执行都是独立的,且只会在最小的那个分层执行
    IIInsomnia
        16
    IIInsomnia  
    OP
       89 天前
    @aliipay 时间轮是保证任务到时间被执行即可,至于执行多久跟时间轮无关了
    jones2000
        17
    jones2000  
       89 天前
    任务优先级没有体现出来, 当来了一个优先级很高的任务,如果机器 CPU , 内存使用多, 会导致优先级高的任务,无法快速完成, 需要把正在执行的低优先级任务的中间数据和状态存盘,停止这个任务,释放内存。 当高优先级任务执行完成以后, 在从文件里面恢复低优先级任务执行,继续执行。
    doraemonki
        18
    doraemonki  
       88 天前
    兄弟,虽然你的代码一顿操作猛如虎,但是 Benchmark 性能好像比不过直接 go 出去然后 sleep 啊
    IIInsomnia
        19
    IIInsomnia  
    OP
       85 天前
    @doraemonki 直接 go sleep ,任务量大,你得有多少协程在等待阻塞
    doraemonki
        20
    doraemonki  
       85 天前
    @IIInsomnia #19 要限制携程数量直接用 goroutine pool 就好了,goroutine 阻塞本身是一个健康的操作,有什么问题吗。我这边实际测试下来 timewheel 任务调度性能与定时器精度都比不过直接 sleep ,你这个时间轮性能优化在哪里呢,要不写一个 benchmark 实际场景比较一下?内存角度,从 go1.21 开始 100w 个 goroutine 也只需要 400M 内存,我认为这也不算高吧。附代码: https://www.codecopy.cn/post/cr388c
    IIInsomnia
        21
    IIInsomnia  
    OP
       84 天前
    @doraemonki 如果有大量的定时任务需要等待几个小时甚至几天呢?你觉得你的服务还会有资源可用吗? goroutine pool 池子该多大呢?池子被耗尽,短时间内无法回收;而时间轮不会,说白了就是一个使用场景的问题,时间轮是有特定使用场景的
    doraemonki
        22
    doraemonki  
       84 天前
    @IIInsomnia #21 这个场景确实是我没考虑到
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4090 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 00:58 PVG 08:58 LAX 16:58 JFK 19:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86