【发布时间】:2014-04-24 00:07:17
【问题描述】:
我正在设计一个云应用程序,需要一个工作进程来搜索我的数据库以寻找工作,然后执行它。
我似乎找到的关于云中后台任务的大部分信息都涉及某种调度程序和/或排队系统。
我所拥有的不太适合“每 5 分钟运行一次此任务”或“将其添加到队列以稍后执行”模型。我认为我的问题的主要区别在于工人自己找到工作要做,而不是由定期调度程序或生成工作的外部进程分配。
我所拥有的基本上是一个巨大的表格,其中每个条目都有三个字段:
-
job:要执行的小任务,假设它从 twitter 帐户获取最后一条消息并将其存储在数据库中 - 执行该工作的
interval:每 5 分钟说一次,N.B.对于表中的每个条目,间隔是任意的且不同 - 执行作业时的最后一个
date
我实现这一点的方式是让一个具有无限循环的工作人员。当它进入循环时,它会搜索数据库a)寻找date + interval < currentTime的项目,b)当它找到一个时,它设置date = currentTime,然后c)执行该作业。如果没有工作的 ATM,它会休眠几秒钟,然后再试一次。
我将有许多并行工作人员同时搜索数据库,这就是我在上面的段落中先执行 b) 然后执行 c) 的原因。由于存在并行工作人员,因此操作 a) 和 b) 是对数据库的原子操作,以防止工作重复。如果worker在a)和b)之后崩溃了,但是在它设法完成工作之前,这没什么大不了的,worker可以在下一个时间间隔完成;原因是工作不是在时不变的系统中执行的,因此失败作业的积压场景没有任何好处,因为任务必须按照它们的确切间隔执行,所以最好跳过 1 个间隔而不是有不均匀的间隔在它们之间执行任务。
我的问题是这是否是一个合理的实施策略?如果是这样,我如何在云上实现这个过程(我正在使用 Heroku,但将来可能会切换到 EC2)?我还没有写任何代码,所以我欢迎其他建议(也许我误解了队列系统的用例/应用程序)。
【问题讨论】:
-
我不清楚你为什么不想推过队列——这听起来几乎是一样的,但不是让工人听,你希望他们拉。为什么拉而不是推?
-
因为我有一个基本上是一堆 crontab 的数据库。许多不同的项目需要以不同的重复间隔执行。对这种架构有什么建议吗?
标签: heroku amazon-ec2 cloud message-queue