V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Mirana
V2EX  ›  分享创造

用 redis 的事件库做了一个定时任务队列

  •  
  •   Mirana ·
    flex1988 · 2016-04-22 15:28:03 +08:00 · 4845 次点击
    这是一个创建于 2925 天前的主题,其中的信息可能已经有所发展或是发生改变。
    每当你创建一个任务的时候,会在循环里里加入一个定时事件,在时间到的时候往你指定的 ip 和端口发一条消息。

    rpc once 1000 localhost:8001 {message}
    rpc repeat 1000 localhost:8001 {message}
    del :timeId

    支持 unix 时间戳
    rpc once 1461216640000 localhost:8001 {message}

    github: https://github.com/flex1988/redis-task

    可以做到毫秒级的精度和低 cpu 。

    大家觉得这个思路怎么样
    8 条回复    2016-04-28 14:44:49 +08:00
    hambut
        1
    hambut  
       2016-04-22 15:32:02 +08:00
    安利一个黑魔法,我是用 redis 的 notify-keyspace-events + psubscribe 做的~~
    Mirana
        2
    Mirana  
    OP
       2016-04-22 15:33:53 +08:00
    @hambut 我知道这个方法,而且底层的时间库都是一样的,所以我直接用命令把参数和端口传进去,让 redis 去发消息
    icybee
        3
    icybee  
       2016-04-22 15:35:35 +08:00
    pretty awesome, 和 rabbitmq + celery 相比有什么差别?
    Mirana
        4
    Mirana  
    OP
       2016-04-22 15:47:15 +08:00
    @icybee 不太懂 celery ,我只关注定时触发,并没有考虑分布式的任务调度。
    cevincheung
        5
    cevincheung  
       2016-04-24 08:46:13 +08:00
    DelayQueue 么? 怎么验证有没有被正确消费。
    Mirana
        6
    Mirana  
    OP
       2016-04-27 14:51:48 +08:00
    @cevincheung 回一个确认消息去确认消息的消费。
    cevincheung
        7
    cevincheung  
       2016-04-27 14:58:39 +08:00
    @Mirana
    假设从 List 中 POP 出一个
    执行逻辑
    回复消费完毕


    假设从 List 中取出完成执行逻辑发生异常,脚本结束并退出,没有回复。怎么搞?
    Mirana
        8
    Mirana  
    OP
       2016-04-28 14:44:49 +08:00
    @cevincheung 事实上我考虑的是 接受到消息之后直接回复一个接受到消息的消息。所以这里的确认消息是对于正确接收到消息来说的。

    至于你说的脚本执行异常,可以用其他的手段去确保,比如你可以把所有的任务放在 mysql 里,不管是正确执行还是执行异常都会去更新任务的状态。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5629 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:28 · PVG 11:28 · LAX 20:28 · JFK 23:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.