Есть ли способ обеспечить поведение FIFO (первым пришел, первым вышел) с очередями задач в GAE?

Есть ли способ обеспечить поведение FIFO (первым пришел, первым обслужен) с очередями задач в GAE?

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

Документы говорят:

https://developers.google.com/appengine/docs/java/taskqueue/overview-push

Порядок выполнения задач зависит от нескольких факторов:

Позиция задачи в очереди. App Engine пытается обрабатывать задачи в порядке FIFO > (первым поступил, первым обслужен). Как правило, задачи помещаются в конец очереди, а выполняется из головы очереди.

Задолженность по задачам в очереди. Система пытается обеспечить минимальную задержку возможно для любой заданной задачи с помощью специально оптимизированных уведомлений планировщику. Таким образом, в случае, если очередь имеет большое количество невыполненных задач, планирование системы может «перебрасывать» новые задачи в начало очереди.

Значение свойства etaMillis задачи. Это свойство определяет самое раннее время, когда задача может быть выполнена. App Engine всегда ждет, пока после указанного ETA для обработки push-задач.

Значение свойства countdownMillis задачи. Это свойство определяет минимум количество секунд ожидания перед выполнением задачи. Обратный отсчет и эта взаимоисключающие; если вы укажете одно, не указывайте другое.

Что мне нужно сделать? В моем случае я буду обрабатывать 1-2 миллиона событий в день, поступающих от транспортных средств. Эти события могут отправляться с любым интервалом (1 секунда, 1 минута или 1 час). Должен быть обеспечен порядок обработки событий. Мне нужен процесс по порядку отметок времени, который генерируется на встроенном устройстве внутри транспортного средства.

Что у меня есть сейчас?

  1. Сервлет Rest, который вызывается потребителем и создает задачу (данные о событии находятся в полезной нагрузке).

  2. После этого рабочий сервлет получает эту задачу и:

    • Десериализует данные события;

    • Поместить событие в хранилище данных;

    • Обновление автомобиля в хранилище данных.

Итак, опять же, есть ли какой-нибудь способ обеспечить простое поведение FIFO? Или как я могу улучшить это решение, чтобы получить это?

7
задан André Salvati 5 April 2012 в 13:47
поделиться