Создание запланированных заданий в мультитенантном приложении - PullRequest
1 голос
/ 16 января 2020

Я создаю мультитенантное веб-приложение с использованием Laravel / PHP, которое в конце будет размещено на AWS как SaaS. У меня есть около 15-20 различных фоновых заданий, которые требуют планирования для каждого арендатора. Задания должны выполняться каждые 5 минут. Таким образом, количество заданий, которые необходимо выполнить для 100 арендаторов, составило бы около 2000. У меня осталось 2 проблемы в достижении этого

  1. Существует ли облачное решение, которое распределяет и управляет нагрузкой по расписанию? задания автоматически?
  2. Если кто-то есть, как мы можем создать эти 15+ запланированных заданий на лету? Доступен ли API?

Нужна ваша помощь

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Наконец-то я нашел решение своей проблемы.

Мы не можем масштабировать фоновые задания так, как я хочу. Мне потребовалось посмотреть на решение с совершенно другой точки зрения.

Идеальное решение моей проблемы состоит в том, что я должен генерировать сообщения SQS (с полезной нагрузкой, описывающей идентификатор арендатора, задание должно быть выполнено и любые дополнительные параметры), соответствующие количеству арендаторов за установленный интервал и поставь в очередь

Например, если у меня 100 арендаторов и я хочу запускать «Задание 1» каждый раз, основное приложение будет генерировать 100 сообщений SQS и помещать их в определенную очередь SQS каждый час. Он будет делать то же самое для всех 15 различных заданий, которые у меня есть на каждого арендатора.

С другой стороны, масштабируемая AWS лямбда-функция, прослушивающая очередь SQS, подберет полезную нагрузку и выполнит намеченную задачу на основе данные переносятся полезной нагрузкой.

Но, к сожалению, мой опыт заключается в технологии PHP / Laravel, которой пока нет в стеке AWS Lambda. Поэтому я нашел обходной путь следующим образом.

Я создал Docker изображение с помощью своего приложения PHP / Laravel и поместил его в Amazon ECS (контейнерная служба EC2). Тем не менее, у меня есть функция AWS Lambda, но на этот раз она действует как триггер для моих docker контейнеров. Лямбда выбирает сообщение SQS, обрабатывает полезную нагрузку и порождает контейнер Docker в ECS на основе моего Docker образа. Я получил некоторые идеи из следующей статьи, чтобы прийти к этому решению.

https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-lambda/

1 голос
/ 23 января 2020

Laravel имеет возможность планировать задачи / задания:

См .: https://laravel.com/docs/6.x/scheduling

, чтобы вы могли сохранить задания своего клиента в своей базе данных и затем сделайте это, как показано ниже:

Планирование заданий в очереди Метод задания можно использовать для планирования задания в очереди. Этот метод предоставляет удобный способ планирования заданий без использования метода вызова для ручного создания замыканий для постановки в очередь задания:

$schedule->job(new ClientJob)->everyFiveMinutes();

// Dispatch the job to the "clientjob" queue...
$schedule->job(new ClientJob, 'clientjob')->everyFiveMinutes();

или

Планирование команд оболочки

Метод exe c может использоваться для выдачи команды операционной системе:

$schedule->exec('node /home/forge/script.js')->everyFiveMinutes();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...