我正在考虑从AppEngine迁移到EC2 / Elastic Beanstalk,因为我需要位于EU内的服务器[AppEngine不提供服务器位置选项AFAIK]。我已经运行了Elastic Beanstalk示例应用程序,尽管它很好;但是我非常依赖的AppEngine功能之一是离线任务队列/ cron工具,因为我会定期从其他站点获取大量数据。我想知道我需要在Elastic Beanstalk / EC2上设置什么才能复制这个任务队列工具,是否还有最佳实践,需要做多少工作等等。
谢谢!
答案 0 :(得分:1)
Beanstalk中cron服务的潜在问题是,如果应用程序在多个实例上运行,则可能由多个服务调用给定的调度命令。在运行的Tomcat实例之间需要协调以确保作业仅由一个运行,并且如果其中一个死亡,则cron服务不会被中断。
我如何实现它是这样的:
每个tomcat实例都将运行一个cron线程,该线程应该从WAR读取配置,并根据需要安排自己休眠直到下一次服务调用。一旦时间到达,实例应首先尝试通过首先从数据库中获取该命令的最后一次调用时间来“声明”该调用,然后更新它以获得“锁定”。
query(SELECT last_execution_time FROM crontable WHERE command = ?)
if(NOW() - last_execution_time < reasonable window) skip;
query(UPDATE crontable SET last_execution_time = NOW() WHERE command = ? AND last_execution_time = ?)
if(number of rows updated == 0) skip;
run task()
这里的关键元素是我们还在WHERE子句中包含last_execution_time
,确保如果其他实例在SELECT和UPDATE之间更新它,更新将返回没有行受影响的情况和此实例将跳过执行该任务。
答案 1 :(得分:0)