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

2016-04-22 15:28:03 +08:00
 Mirana
每当你创建一个任务的时候,会在循环里里加入一个定时事件,在时间到的时候往你指定的 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 。

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


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

至于你说的脚本执行异常,可以用其他的手段去确保,比如你可以把所有的任务放在 mysql 里,不管是正确执行还是执行异常都会去更新任务的状态。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/273660

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX