Задача-выполнение-ETA в Push-очередях AppEngine из-за отсутствия синхронизации часов сервера

Push-очереди AppEngine позволяют планировать задачи для будущего выполнения, если они добавляются с TaskOptions.etaMillis(...) вариант. Этот метод ожидает long параметр, который указывает время, когда для выполнения задачи в абсолютных мс, так же, как возвращается System.currentTimeMillis(),

Учитывая, что AppEngine не дает никаких гарантий относительно синхронизации часов сервера, и часы могут быть отключены чем-то порядка ЧАСОВ!!! (см. "Google I/O 2010 - конвейеры данных с Google App Engine" в 0:36:07), как это может быть надежно?

Давайте рассмотрим следующий пример:

  • HTTP-запрос приходит и направляется к экземпляру, часы которого на 30 минут впереди
  • Во время обработки запроса я бы хотел отложить некоторую пакетную обработку до фоновой задачи
  • Я хотел бы, чтобы результаты были доступны пользователю в течение 10 секунд.
  • Итак, я планирую задачу с ETA System.currentTimeMillis() + 10,000
  • Учитывая 30-минутный перекос часов, это ETA фактически соответствует 30 минутам и 10 секундам с этого момента.
  • Таким образом, если задача теперь обрабатывается другим экземпляром, она может находиться в режиме ожидания более 30 минут.
  • Излишне говорить, что для пользователя может показаться, что мой сервис умер

Это как-то предотвращено в базовом API? Если нет, то чем могут быть полезны задачи ETA вообще? Не нужно ли указывать ETA как относительное время, а не как абсолютное, чтобы это работало?

Действительно печальная часть в том, что на самом деле есть функция под названием TaskOptions.countdownMillis(...) которое ожидает относительное время, но, глядя на исходный код, который в конечном итоге обрабатывает это значение, можно увидеть, что оно просто преобразуется в спецификацию абсолютного времени, основанную на той же крайне ненадежной System.currentTimeMillis(),

Что еще хуже: если вы не укажете ETA или обратный отсчет, эта функция просто использует текущее системное время, а не 0, поэтому даже задача, которую вы ожидаете выполнить немедленно, может оказаться в режиме ожидания в течение часа или более!

Это какая-то серьезная ошибка или я что-то упустил?

Кроме того, то же самое должно относиться к аренде задач в очереди на вытягивание, верно?

1 ответ

Решение

Если вы установите обратный отсчет до 10000 мс, то задача обычно запускается примерно через 10 секунд, но иногда она может быть отложена на несколько минут. Они предназначены для задач, которые конечный пользователь не ждет.

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

Другие вопросы по тегам