我正在设计一个云应用,需要一个工作流程来搜索我的数据库寻找工作,然后执行它。
我似乎在云中的后台任务主题上找到的大部分信息涉及某种调度程序和/或排队系统。
我所拥有的内容并不完全符合“每5分钟运行一次此任务”或“将其添加到稍后要执行的队列”模型。我认为我的问题的主要区别在于工人自己找工作要做,而不是由定期调度程序或生成工作的外部流程分配。
我所拥有的基本上是一个巨大的表,每个条目有三个字段:
job
:要执行的小任务,让我们说它从Twitter帐户获取最后一条消息并将其存储在数据库中interval
:每5分钟一次,N.B。区间是任意的,对于表中的每个条目都是不同的date
我实现这一点的方法是让一个具有无限循环的worker。当它进入循环时,它会搜索数据库a)查找date + interval < currentTime
,b)找到项目时的项目,设置date = currentTime
,然后c)执行作业。如果ATM没有工作,它会睡几秒钟,然后再试一次。
我将有许多并行工作人员同时搜索数据库,这就是为什么我在上面的段落中首先b)然后c)。由于存在并行工作程序,因此操作a)和b)是对数据库的原子操作,以防止工作被复制。如果工人在a)和b)之后崩溃,但在它设法完成工作之前,这没什么大不了的,工人们可以在下一个时间间隔完成工作;这样做的原因是工作不是在时不变系统中执行的,因此失败作业的积压方案没有任何好处,因为任务必须以其精确的间隔执行,因此最好跳过1个间隔而不是间隔不均匀任务执行之间。
我的问题是,这是否是一个合理的实施策略?如果是这样,我如何在云上实现这一过程(我正在使用Heroku,但将来可能会切换到EC2)?我还没有编写任何代码,所以我欢迎其他建议(也许我误解了队列系统的用例/应用程序)。
答案 0 :(得分:0)
这听起来非常接近于使用像预定作业这样的东西,你可能会走得很好,也可以采用更传统的方式。没有理由不能安排一个工作每隔几秒运行一次。
但是,这种寻找工作的想法听起来很狡猾。如果两个工作人员发现同一个任务同时运行会发生什么?此外,应用程序中是否没有可以指示工作需要的触发器?你有代码寻找工作似乎很奇怪。
你可以通过简单的周期性后台任务走很长的路,所以在推出自己的任务之前我会耗尽所有可能性。