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多个用户:
- Cronjob每分钟执行一次PHP脚本。
- PHP脚本获取服务器上的DB列表。
- PHP脚本遍历DB列表,每个DB创建3个GAE推送任务(即每个API,每个用户1个)。
- 每个推送任务都会调用处理特定API的同步过程的应用程序端点。
我还没有开始编写上述例程,但它似乎原则上有效。我预见到的潜在问题是:
- 在PHP脚本完成所有推送任务之前,Cronjob会执行1分钟的执行限制。我认为这不太可能,因为我可以将100个任务捆绑到单个addTasks()调用中,因此对于100个用户,脚本执行应该<10秒。
- 由于执行时间较慢,任务队列会备份,这意味着API调用的频率低于每分钟。这可能会导致一些无法管理的数据同步问题。
- 用户的任务执行被延迟,但由于cronjob每分钟都在创建新任务,这可能导致同一用户的多个任务和在不到60秒的时间内执行相同的API,从而阻止对其中一个API的访问。
有没有人对上述有任何想法,有这种性质的任务队列的经验,或者有关GAE推送队列的任何提示可以帮助我,拜托?
首先,我想说明任务队列REST API自2018年2月20日起不可用,因此使用任务队列的选项是使用API的新alpha版本,称为Cloud Tasks API。
让我对您在问题中突出显示的三点提出一些意见:
- 在你的用例中,你只需要create the different Push Queues一次,然后运行cron job,它将为每个用户执行一个creates the tasks处理程序。也许一个很好的解决方案是拥有不同的cron作业,每个作业都负责为一部分用户创建推送任务。在单个请求中处理所有数据库搜索和任务创建可能不可行,具体取决于您如何管理它,因此您可以同时编程多个cron作业,以便可以跨越多个实例来处理即将发生的并行请求每分钟从不同的cron工作。
- 确实,队列中的任务不一定按照它们排队的顺序进行处理,因此如果TASK_2_USER_1在TASK_1_USER_1已经存在且没有处理的情况下进入QUEUE_USER_1,则可能会出现问题。但是,您可以通过定义几个指令来控制任务处理的速率,如this guide中所述,以确保在预期的时间范围内执行任务。
- 与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) - 每分钟为每个用户同时执行相同的任务