gpt4 book ai didi

google-app-engine - 在 EC2/Elastic Beanstalk 上复制 AppEngine 的任务队列工具

转载 作者:太空宇宙 更新时间:2023-11-03 15:25:58 28 4
gpt4 key购买 nike

我正在考虑从 AppEngine 迁移到 EC2/Elastic Beanstalk,因为我需要位于欧盟境内的服务器 [AppEngine 不提供服务器位置选项 AFAIK]。我已经运行了 Elastic Beanstalk 示例应用程序,就目前而言,它还不错;然而,我非常依赖的 AppEngine 功能之一是离线任务队列/cron 工具,因为我会定期从其他站点获取大量数据。我想知道我需要在 Elastic Beanstalk/EC2 上设置什么来复制这个任务队列设施,是否有任何最佳实践,需要多少工作等等。

谢谢!

最佳答案

Beanstalk 中 cron 服务的一个潜在问题是,如果应用程序在多个实例上运行,则给定的计划命令可能会被多个服务调用。正在运行的 Tomcat 实例之间需要协调,以确保作业仅由一个运行,并且如果其中一个死掉,cron 服务不会中断。

我的实现方式是这样的:

  1. 将 cron 作业“配置文件”与 WAR 打包在一起。此文件应包含频率和 URL(因为每个实际的 cron 只是对特定 URL 的调用,正如 AE 所做的那样)
  2. 使用单个数据库表来保持协调。它至少需要两列。
    1. 一个主键或唯一键(字符串)用于保存命令及其频率。 (例如“@daily http://your-app/some/cron/handler/url”)
    2. 第二列保存最后执行时间。

每个 tomcat 实例将运行一个 cron 线程,该线程应从 WAR 中读取配置并根据需要安排自身休眠,直到下一次服务调用。一旦时间到了,实例应该首先尝试通过首先从数据库中获取该命令的最后调用时间来“声明”调用,然后更新它以获得“锁”。

  1. query(SELECT last_execution_time FROM crontable WHERE command = ?)
  2. if(NOW() - last_execution_time < reasonable window) skip;
  3. query(UPDATE crontable SET last_execution_time = NOW() WHERE command = ? AND last_execution_time = ?)
  4. if(number of rows updated == 0) skip;
  5. run task()

这里的关键元素是我们还包括了 last_execution_time在 WHERE 子句中,确保如果在我们的 SELECT 和 UPDATE 之间有其他实例更新它,更新将返回没有行受到影响并且该实例将跳过执行该任务。

关于google-app-engine - 在 EC2/Elastic Beanstalk 上复制 AppEngine 的任务队列工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5437495/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com