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

时间:2020-01-16 18:35:59

标签: php laravel amazon-web-services cloud scheduled-tasks

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

  1. 是否有一个云解决方案可以自动分配和管理预定作业的负载?
  2. 如果一个人在那里,我们如何动态创建那15个以上的预定作业?是否有可用的API?

寻求帮助

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

Laravel可以安排任务/工作:

引用:https://laravel.com/docs/6.x/scheduling

因此您可以将客户端的作业保留在数据库中,然后执行以下操作:

安排排队的作业 作业方法可用于安排排队的作业。此方法提供了一种调度作业的便捷方法,而无需使用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();
相关问题