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 для каждой БД (т. Е. По одной на API для каждого пользователя).
  4. Каждая задача push вызывает конечную точку приложения, которая обрабатывает процесс синхронизации для определенного API.

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

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

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

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

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


person Andy    schedule 26.02.2018    source источник


Ответы (1)


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

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

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

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

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

person dsesto    schedule 02.03.2018