0

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

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

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

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

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

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

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

  1. 在 PHP 脚本完成创建所有推送任务之前,Cronjob 达到了 1 分钟的执行限制。我认为这不太可能,因为我可以将 100 个任务捆绑到一个 addTasks() 调用中,因此对于 100 个用户,脚本执行时间应该小于 10 秒。

  2. 由于执行时间缓慢,任务队列会备份,这意味着 API 调用的频率低于每分钟。这可能会导致一些无法管理的数据同步问题。

  3. 用户的任务执行会延迟,但由于 cronjob 每分钟创建新任务,这可能会导致同一用户和同一 API 的多个任务在不到 60 秒的时间内执行,从而阻止对其中一个 API 的访问。

是否有人对上述内容有任何想法,有这种性质的任务队列的经验,或者关于 GAE 推送队列的任何提示可以帮助我吗?

4

1 回答 1

0

首先,我想说明的是,截至 2018 年 2 月 20 日,Task Queue REST API 不可用,因此使用 Task Queues 的选项是使用 API 的新 alpha 版本,称为Cloud Tasks API

让我对您在问题中强调的三点发表一些评论:

  1. 在您的用例中,您必须只创建一次不同的推送队列,然后运行​​cron 作业,该作业将执行 为每个用户创建任务的处理程序。也许对您来说一个好的解决方案是拥有不同的 cron 作业,每个作业都负责为一部分用户创建推送任务。根据您的管理方式,在单个请求中处理所有数据库搜索和任务创建可能不可行,因此您可以同时编写多个 cron 作业,以便可以跨越多个实例来处理即将到来的并行请求每分钟来自不同的 cron 作业。
  2. 确实,队列中的任务不一定按照它们入队的顺序进行处理,因此如果您的TASK_2_USER_1TASK_1_USER_1已经存在且未处理时转到QUEUE_USER_1 ,这可能会出现问题。但是,您可以通过定义多个指令来控制任务的处理速度,如本指南中所述,以确保任务在预期的时间范围内执行。
  3. 2相关;您可以通过调整处理任务的速率来控制工作人员的扩展行为。也许你也可以在提交新任务之前调查一下检索任务(或队列)的状态,即如果前一个任务尚未执行,则不要提交新任务;但是,随着时间的推移,这将成为一个更大的问题,因为如果非阻塞间隔为 1 分钟,任务提交间隔为 1 分钟,这最终可能会导致问题。

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

最后的建议是,确保申请加入新 Cloud Tasks API的白名单,以便访问新文档。

于 2018-03-02T11:18:17.307 回答