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