动态添加规则的定时任务处理,除了自己实现一个时间轮的计时器,有成熟的开源产品吗?

266 天前
 moell

背景

用于用户自主创建定时任务,规则存储到 Redis 或者 MySQL, 服务端根据规则定时处理

目前的想法

自己实现一个时间轮,秒为单位或 100 毫秒为单位

自己实现的主要疑问

了解过 xxl-job ,我觉得不适合我的场景,不知道理解是否有误,求指点。

1598 次点击
所在节点    程序员
34 条回复
ysjiang4869
265 天前
之前看小米还是美团的一个实现,就是利用 mq 延迟队列做
moell
265 天前
@ShuWei 是的,如果我自己实现时间轮,我的想法是,我当前卡槽的数据投递到队列,让队列进行消费,如果需要足够快,就需要增加消费能力。能说说大概会遇到的问题吗?
moell
265 天前
@ysjiang4869 https://segmentfault.com/a/1190000022783535 看过这方案吗? 朋友他们公司的思路非常完整了。就是没有开源。
关于 1, 我现在的理解,是不是不应该去轮训数据,启动服务的时候,直接维护这个卡槽的队列,可以维护在 redis 中,然后,到了时间时,直接新开启一个线程/协程去投递队列,然后消费的服务进行消费。

你们这边确定方案了吗? 可以多交流交流
moell
265 天前
@LoveyLoverson 延时队列我感觉也可行,我找找看他们说的小米美团的方案。
moell
265 天前
@burymme11 @SilentRhythm 多谢解惑
ShuWei
265 天前
@moell 这个过程,可能产品设计上要注意,比如说时间粒度不能太细,最终任务的逻辑不能过于复杂,尽量不要出现相互依赖的任务等等,这些都会带来服务端或者设备端的各种问题,建议你们先做,遇到问题了再做一些修正就是了
moell
265 天前
@ShuWei 好的。谢谢
SmiteChow
265 天前
生成任务和消费任务是两码事,不要混为一谈
kuituosi
265 天前
1.异步队列基本不存在时效性问题,有的话是你使用不当造成的
2.每秒都重复执行任务不适合大规模任务系统,需要采用其他方式
3.时间轮太多任务导致效率低的话可以考虑层级时间轮
4. xxl-job 本质是一个伪分布式,实质是单机的任务工具,对你的需求没有任何帮助
Mystery0
265 天前
我这里也有这种场景,用户可以设置一段时间内的定时任务,量也不大,就用 go 的 channel 来做定时,每隔一段时间往 channel 发一个消息,调度器去数据库拉取这段时间需要执行的任务,然后交给 worker 执行
因为我这里量不大而且对时间不用太敏感(允许有 1-2 分钟的偏差),所以就自己写了一个简单的

https://github.com/Mystery00/go-job
moell
264 天前
@kuituosi 谢谢,很受用
@Mystery0 谢谢,我参考参考。1-2 分钟对于我们来说可能有点接受不了。你现在时间偏差是因为消费不够及时的原因吗?
Mystery0
264 天前
@moell 不是,因为额外有一个定时任务去数据库拉任务,整体执行的误差就在这里,我的场景对时间不敏感,就简单写了

现在想来,我的更重要的应该是用 channel 和数据库来支持多执行器了,任务执行那里似乎没啥高级的😂😂
ptaooo
261 天前
@moell
刚才翻了一下代码,我这边应该是和 xxl-job 管理界面用的相同的 api ,从界面操作上看相关的是哪个接口,/dog
moell
261 天前
@ptaooo 谢谢,有心了。

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

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

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

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

© 2021 V2EX