Google App Engine(GAE) - 每分钟为每个用户同时执行相同的任务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Google App Engine(GAE) - 每分钟为每个用户同时执行相同的任务相关的知识,希望对你有一定的参考价值。

我目前有2个用户的php应用程序,部署到Google App Engine(GAE)标准环境。我的目标是在一年内拥有多达100个用户。

所有用户执行相同的应用程序代码,但拥有自己的数据库副本。

每个用户都需要每分钟与3个第三方API同步数据。其中一个API处理请求和响应的速度很慢。其中一个API具有一些严格的限制,如果在60秒的时间内进行多个API调用,它将阻止访问一段时间。

我目前每分钟都运行一个cronjob,它从用户数据库中获取API密钥,进行三次API调用,然后在第二个用户数据库上重复该过程。这很好,但显然不会扩展。

使用Google App Engine资源,我设计了以下计划来提高应用的可扩展性并应对100多个用户:

  1. Cronjob每分钟执行一次PHP脚本。
  2. PHP脚本获取服务器上的DB列表。
  3. PHP脚本遍历DB列表,每个DB创建3个GAE推送任务(即每个API,每个用户1个)。
  4. 每个推送任务都会调用处理特定API的同步过程的应用程序端点。

我还没有开始编写上述例程,但它似乎原则上有效。我预见到的潜在问题是:

  1. 在PHP脚本完成所有推送任务之前,Cronjob会执行1分钟的执行限制。我认为这不太可能,因为我可以将100个任务捆绑到单个addTasks()调用中,因此对于100个用户,脚本执行应该<10秒。
  2. 由于执行时间较慢,任务队列会备份,这意味着API调用的频率低于每分钟。这可能会导致一些无法管理的数据同步问题。
  3. 用户的任务执行被延迟,但由于cronjob每分钟都在创建新任务,这可能导致同一用户的多个任务和在不到60秒的时间内执行相同的API,从而阻止对其中一个API的访问。

有没有人对上述有任何想法,有这种性质的任务队列的经验,或者有关GAE推送队列的任何提示可以帮助我,拜托?

答案

首先,我想说明任务队列REST API自2018年2月20日起不可用,因此使用任务队列的选项是使用API​​的新alpha版本,称为Cloud Tasks API

让我对您在问题中突出显示的三点提出一些意见:

  1. 在你的用例中,你只需要create the different Push Queues一次,然后运行cron job,它将为每个用户执行一个creates the tasks处理程序。也许一个很好的解决方案是拥有不同的cron作业,每个作业都负责为一部分用户创建推送任务。在单个请求中处理所有数据库搜索和任务创建可能不可行,具体取决于您如何管理它,因此您可以同时编程多个cron作业,以便可以跨越多个实例来处理即将发生的并行请求每分钟从不同的cron工作。
  2. 确实,队列中的任务不一定按照它们排队的顺序进行处理,因此如果TASK_2_USER_1在TASK_1_USER_1已经存在且没有处理的情况下进入QUEUE_USER_1,则可能会出现问题。但是,您可以通过定义几个指令来控制任务处理的速率,如this guide中所述,以确保在预期的时间范围内执行任务。
  3. 与2相关;您可以通过调整处理任务的速率来控制工作人员的缩放行为。也许您还可以在提交新任务之前调查检索任务(或队列)的状态,即如果之前的任务尚未执行,则不提交新任务;然而,随着时间的推移,这将成为一个更大的问题,因为如果非阻塞间隔为1分钟且任务子定期间隔为1分钟,则最终可能会导致问题。

我认为这涵盖了有关任务队列的基础知识。任何其他“更深层次”的问题可能对您的用例过于具体,而且难以为此提供帮助(SO社区也喜欢具体问题)。

作为最后一个建议,请确保apply to be whitelisted to the new Cloud Tasks API以便能够访问新文档。

以上是关于Google App Engine(GAE) - 每分钟为每个用户同时执行相同的任务的主要内容,如果未能解决你的问题,请参考以下文章

GAE 上的 p3p 标头(Google App Engine)

Google App Engine(GAE) - 每分钟为每个用户同时执行相同的任务

GWT与Google App Engine-上传文件

Google App Engine 的模板引擎 [关闭]

为啥在 Google App Engine 上使用 Django?

我在哪里可以看到Google App Engine中的日志?