Пакетная обработка входящих уведомлений с помощью GAE

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

Я хотел бы выполнить пакетную обработку входящих уведомлений, например, обработать все уведомления, полученные за последнюю минуту (моя обработка включает транзакции, поэтому мне нужно их объединить, чтобы избежать конфликтов). Кажется, есть несколько способов сделать это...

Для хранения входящих уведомлений я мог бы:

  1. добавить объект в хранилище данных или
  2. создать задачу очереди вытягивания.

Для запуска обработки я мог бы:

  1. Запускайте задание CRON каждую минуту (это хорошая идея?) или
  2. Пусть обработчик, обрабатывающий входящие запросы Sendgrid, инициирует обработку уведомлений, но только в том случае, если последний триггер был более минуты назад (может хранить дату последнего триггера в кэше памяти).

Я хотел бы услышать плюсы и минусы вышеперечисленных или других подходов.


person gaefan    schedule 18.05.2017    source источник


Ответы (1)


Через пару дней я придумал реализацию, которая работает очень хорошо.

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

Для запуска рабочего процесса для обработки задач в очереди извлечения я наткнулся на этот отличный пост в блоге о Задания Cron по запросу от бывшего разработчика GAE. Я не хочу повторять весь этот пост здесь, но основная идея заключается в том, что каждый раз, когда вы добавляете задачу в очередь вытягивания, вы создаете рабочую задачу (обычную очередь выталкивания) для обработки задач в очереди вытягивания. Для рабочей задачи вы добавляете имя задачи, соответствующее временному интервалу, чтобы убедиться, что у вас есть только одна рабочая задача в этом временном интервале. Это позволяет вам получить преимущество 1-минутного задания CRON, но дополнительный бонус к производительности, который запускается только при необходимости, поэтому у вас нет задания CRON, когда оно не нужно.

person gaefan    schedule 21.05.2017