Есть ли способ обеспечить поведение 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 час). Должен быть обеспечен порядок обработки событий. Мне нужен процесс по порядку отметок времени, который генерируется на встроенном устройстве внутри транспортного средства.
Что у меня есть сейчас?
Сервлет Rest, который вызывается потребителем и создает задачу (данные о событии находятся в полезной нагрузке).
После этого рабочий сервлет получает эту задачу и:
Десериализует данные события;
Поместить событие в хранилище данных;
Обновление автомобиля в хранилище данных.
Итак, опять же, есть ли какой-нибудь способ обеспечить простое поведение FIFO? Или как я могу улучшить это решение, чтобы получить это?