我的 PHP 应用程序目前有 2 个用户,部署到 Google App Engine (GAE) 标准环境。我的目标是在一年内拥有多达 100 个用户。
所有用户都执行相同的应用程序代码,但拥有自己的数据库副本。
每个用户每分钟需要与 3 个第三方 API 同步数据。其中一个 API 处理请求和响应的速度很慢。其中一个 API 有一些严格的限制,如果在 60 秒内进行了多个 API 调用,它将在一段时间内阻止访问。
我目前每分钟运行一个 cronjob,它从用户数据库中获取 API 密钥,进行三个 API 调用,然后在第二个用户数据库上重复该过程。这工作正常,但显然不会扩展。
使用 Google App Engine 资源,我制定了以下计划来提高我的应用程序的可扩展性并应对 100 多个用户:
- Cronjob 每分钟执行一次 PHP 脚本。
- PHP 脚本获取服务器上的数据库列表。
- PHP 脚本遍历数据库列表,为每个数据库创建 3 个 GAE 推送任务(即每个 API、每个用户 1 个)。
- 每个推送任务调用处理特定 API 的同步过程的应用程序端点。
我还没有开始编写上述例程,但它似乎在原则上有效。我预见的潜在问题是:
在 PHP 脚本完成创建所有推送任务之前,Cronjob 达到了 1 分钟的执行限制。我认为这不太可能,因为我可以将 100 个任务捆绑到一个 addTasks() 调用中,因此对于 100 个用户,脚本执行时间应该小于 10 秒。
由于执行时间缓慢,任务队列会备份,这意味着 API 调用的频率低于每分钟。这可能会导致一些无法管理的数据同步问题。
用户的任务执行会延迟,但由于 cronjob 每分钟创建新任务,这可能会导致同一用户和同一 API 的多个任务在不到 60 秒的时间内执行,从而阻止对其中一个 API 的访问。
是否有人对上述内容有任何想法,有这种性质的任务队列的经验,或者关于 GAE 推送队列的任何提示可以帮助我吗?