在多租户应用程序中创建预定作业
Creating scheduled jobs in a Multi-Tenant application
我正在使用 Laravel/PHP 构建一个多租户 Web 应用程序,最终将作为 SaaS 托管在 AWS 上。我有大约 15-20 个不同的后台作业需要为每个租户安排。这些工作也需要每 5 分钟解雇一次。因此,需要为 100 个租户解雇的工作岗位数量约为 2000 个。要实现这一目标,我面临 2 个挑战
- 是否有云解决方案可以自动分配和管理计划作业的负载?
- 如果有的话,我们如何即时创建 15 个以上的预定作业?有 API 可用吗?
寻求您的帮助
Laravel 可以选择安排 Task/Jobs:
参考:https://laravel.com/docs/6.x/scheduling
因此您可以将客户的工作保留在您的数据库中,而不是像下面那样做:
正在安排排队的作业
job 方法可用于安排排队的作业。此方法提供了一种方便的方式来调度作业,而无需使用 call 方法手动创建 Closures 来对作业进行排队:
$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();
终于,我找到了解决问题的方法。
我们无法按我想要的方式扩展后台作业。它要求我从一个完全不同的角度来研究解决方案。
我的问题的理想解决方案是,我应该生成与设置间隔和队列中的租户数量相对应的 SQS 消息(带有描述租户 ID、需要执行的作业和任何其他参数的负载)它。
例如,如果我有 100 个租户并且我希望每个租户 运行 "Job 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/PHP 构建一个多租户 Web 应用程序,最终将作为 SaaS 托管在 AWS 上。我有大约 15-20 个不同的后台作业需要为每个租户安排。这些工作也需要每 5 分钟解雇一次。因此,需要为 100 个租户解雇的工作岗位数量约为 2000 个。要实现这一目标,我面临 2 个挑战
- 是否有云解决方案可以自动分配和管理计划作业的负载?
- 如果有的话,我们如何即时创建 15 个以上的预定作业?有 API 可用吗?
寻求您的帮助
Laravel 可以选择安排 Task/Jobs:
参考:https://laravel.com/docs/6.x/scheduling
因此您可以将客户的工作保留在您的数据库中,而不是像下面那样做:
正在安排排队的作业 job 方法可用于安排排队的作业。此方法提供了一种方便的方式来调度作业,而无需使用 call 方法手动创建 Closures 来对作业进行排队:
$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();
终于,我找到了解决问题的方法。
我们无法按我想要的方式扩展后台作业。它要求我从一个完全不同的角度来研究解决方案。
我的问题的理想解决方案是,我应该生成与设置间隔和队列中的租户数量相对应的 SQS 消息(带有描述租户 ID、需要执行的作业和任何其他参数的负载)它。
例如,如果我有 100 个租户并且我希望每个租户 运行 "Job 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/