Google App Engine (GAE) — запуск одной и той же задачи одновременно для каждого пользователя, каждую минуту

В настоящее время у меня есть 2 пользователя моего приложения PHP, развернутого в стандартном окружении Google App Engine (GAE). Моя цель — иметь до 100 пользователей в течение года.

Все пользователи выполняют один и тот же код приложения, но имеют свою собственную копию базы данных.

Каждый пользователь должен каждую минуту синхронизировать данные с 3-мя сторонними API. Один из этих API имеет тенденцию очень медленно обрабатывать запрос и отвечать. У одного из API есть несколько жестких дросселей, с помощью которых он будет блокировать доступ на период, если за 60 секунд будет сделано более одного вызова API.

В настоящее время у меня выполняется cronjob каждую минуту, который получает ключи API из пользовательской базы данных, выполняет три вызова API, а затем повторяет процесс для второй пользовательской базы данных. Это прекрасно работает, но явно не будет масштабироваться.

Используя ресурсы Google App Engine, я разработал следующий план для улучшения масштабируемости моего приложения и работы с более чем 100 пользователями:

  1. Cronjob выполняет PHP-скрипт каждую минуту.
  2. PHP скрипт получает список БД на сервере.
  3. PHP-скрипт выполняет итерацию по списку БД, создавая 3 x push-задачи GAE на БД (т. Е. 1 на API на пользователя).
  4. Каждая push-задача вызывает конечную точку приложения, которая обрабатывает процесс синхронизации для определенного API.

Я еще не начал писать вышеупомянутую процедуру, но, похоже, она работает в принципе. Потенциальные проблемы, которые я предвижу:

  1. Cronjob достигает 1-минутного предела выполнения, прежде чем PHP-скрипт завершит создание всех push-задач. Я предполагаю, что это маловероятно, поскольку я могу объединить 100 задач в один вызов addTasks (), поэтому выполнение сценария должно быть < 10 секунд на 100 пользователей.

  2. Резервное копирование очереди задач из-за медленного времени выполнения, то есть вызовы API выполняются реже, чем каждую минуту. Это может вызвать некоторые неуправляемые проблемы с синхронизацией данных.

  3. Выполнение задачи для пользователя задерживается, но поскольку cronjob создает новые задачи каждую минуту, это может привести к тому, что несколько задач для одного и того же пользователя и одного и того же API-интерфейса будут выполнены менее чем за 60 секунд, блокируя доступ к одному из API-интерфейсов.

У кого-нибудь есть какие-либо мысли по поводу вышеизложенного, опыт работы с очередями задач такого рода или какие-либо советы по очереди push-сообщений GAE, которые могут мне помочь, пожалуйста?

0

Решение

Прежде всего, я хотел бы отметить, что API REST Task Queue недоступен с 20 февраля 2018 года, поэтому для работы с очередями задач можно использовать новую альфа-версию API, которая называется API облачных задач.

Позвольте мне дать некоторые комментарии к трем пунктам, которые вы подчеркнули в своем вопросе:

  1. В вашем случае вы должны создать разные Push-очереди только один раз, а затем запустить хрон работа что бы выполнить обработчик, который создает задачи для каждого пользователя. Возможно, хорошим решением для вас будет создание разных заданий cron, каждое из которых отвечает за создание заданий push для подмножества пользователей. Обработка всех поисков в БД и создание задач в одном запросе может оказаться невозможной в зависимости от того, как вы управляете этим, поэтому вы можете запрограммировать одновременно несколько заданий cron, чтобы можно было объединить несколько экземпляров для обработки поступающих параллельных запросов. из разных рабочих мест cron каждую минуту.
  2. Это правда, что задачи в очереди не обязательно обрабатываются в том порядке, в котором они были поставлены в очередь, так что это может быть проблемой, если ваш TASK_2_USER_1 идет к QUEUE_USER_1 когда TASK_1_USER_1 уже там и не был обработан. Однако вы можете контролировать скорость выполнения задач, задав несколько директив, как подробно описано в это руководство, чтобы убедиться, что задачи выполняются в ожидаемые сроки.
  3. Относится к 2; Вы можете контролировать масштабирование рабочих, регулируя скорость выполнения задач. Возможно, вы также можете узнать о получении состояния задачи (или очереди) перед отправкой новой задачи, т. Е. Если предыдущая задача еще не была выполнена, не отправляйте новую задачу; однако со временем это станет более серьезной проблемой, потому что, если интервал неблокирования равен 1 минуте, а интервал передачи задачи — 1 минуте, это, вероятно, в конечном итоге приведет к проблемам.

Я думаю, что это охватывает основы об очередях задач. Любой другой «Глубже» вопрос может быть слишком конкретным для вашего варианта использования, и с этим трудно помочь (такому сообществу также нравятся конкретные вопросы).

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]