在多租户应用程序中创建计划作业

我正在使用 Laravel/PHP 构建一个多租户 Web 应用程序,该应用程序最终将作为 SaaS 托管在 AWS 上。我有大约 15-20 个不同的后台作业需要为每个租户安排。这些工作也需要每 5 分钟解雇一次。因此,需要为 100 个租户解雇的工作数量约为 2000 个。要实现这一目标,我面临两个挑战

  1. 是否有自动分配和管理计划作业负载的云解决方案?

  2. 如果有一个,我们如何动态创建这 15 个以上的预定工作?有可用的 API 吗?

寻求您的帮助


慕丝7291255
浏览 107回答 2
2回答

喵喵时光机

最后,我找到了解决我的问题的方法。我们无法以我想要的方式扩展后台作业。它要求我从一个完全不同的角度来研究解决方案。我的问题的理想解决方案是我应该生成与设定间隔内的租户数量相对应的 SQS 消息(带有描述租户 ID、需要执行的作业和任何其他参数的有效负载)并将其排队。例如,如果我有 100 个租户,并且我想每个我们运行“作业 1”,主应用程序将每小时生成 100 条 SQS 消息并将其排队到特定的 SQS 队列中。对于我每个租户拥有的所有 15 个不同的工作,它都会做同样的事情。另一方面,监听 SQS 队列的可扩展 AWS Lambda 函数将获取有效负载并根据有效负载携带的数据执行预期任务。但不幸的是,我的专长在于 PHP/Laravel 技术,这仍然不在 AWS Lambda 堆栈中。因此,我想出了一个解决方法如下。我使用我的 PHP/Laravel 应用程序构建了一个 Docker 映像,并将其放置在 Amazon ECS(EC2 容器服务)中。尽管如此,我仍然有 AWS Lambda 函数,但这次它充当了我的 docker 容器的触发器。Lambda 选择一条 SQS 消息,处理有效负载并根据我的 Docker 映像在 ECS 上生成一个 Docker 容器。我从下面的文章中得到了一些想法来得出这个解决方案。https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-lambda/

守着星空守着你

Laravel 可以选择安排任务/作业:参考:https ://laravel.com/docs/6.x/scheduling这样您就可以将客户的工作保留在数据库中,而不是像下面这样:调度排队 的作业 job 方法可用于调度排队的作业。该方法提供了一种方便的方法来调度作业,而无需使用 call 方法手动创建闭包来对作业进行排队:$schedule->job(new ClientJob)->everyFiveMinutes();// Dispatch the job to the "clientjob" queue...$schedule->job(new ClientJob, 'clientjob')->everyFiveMinutes();或者调度 Shell 命令exec 方法可用于向操作系统发出命令:$schedule->exec('node /home/forge/script.js')->everyFiveMinutes();
打开App,查看更多内容
随时随地看视频慕课网APP