beanstalkd, позволяющий зарезервировать одну работу дважды

У меня есть экземпляр beanstalkd с двумя рабочими, выбирающими работу из одной трубы.

Я заметил, что иногда один из работников резервирует работу, которая уже была зарезервирована (и над которой работает) другой работник.

Я знаю, что в очереди нет повторяющихся заданий.

Почему beanstalkd позволяет зарезервировать одну и ту же работу дважды?

2 ответа

Решение

Мне кажется, что вы не реализовали протокол должным образом. Вы должны справиться DEADLINE_SOON, и делать TOUCH,

Что означает DEADLINE_SOON?

DEADLINE_SOON является ответом на резервную команду, указывающую, что у вас зарезервировано задание, срок которого действительно скоро (текущий запас прочности составляет приблизительно 1 секунду).

Если вы часто получаете DEADLINE_SOON Ошибки при резервировании, вам, вероятно, следует подумать об увеличении TTR на ваших работах, поскольку это обычно означает, что вы не выполняете их вовремя. Может также случиться так, что вы не удаляете задачи, когда выполнили их.

См. Обсуждение списка рассылки для получения дополнительной информации.

Как работает TTR?

TTR относится только к работе в тот момент, когда она становится зарезервированной. В этом случае таймер (называемый "оставшееся время" в статистике заданий) начинает отсчет времени от заданий. TTR,

  • Если таймер достигает нуля, задание возвращается в очередь готовности.
  • Если задание похоронено, удалено или освобождено до истечения времени таймера, таймер перестает существовать.
  • Если задание коснется до того, как таймер достигнет нуля, таймер начнет отсчет с TTR.

Команда "touch"

Позволяет работнику запрашивать больше времени для работы на работе. Это полезно для работ, которые потенциально могут занять много времени, но вы все еще хотите воспользоваться преимуществами TTR вытаскивая работу от неотзывчивого работника. Работник может периодически сообщать серверу, что он еще жив, и обрабатывает задание (например, он может сделать это в DEADLINE_SOON). Команда откладывает автоматическое освобождение зарезервированного задания до TTR секунд с момента подачи команды.

Задания выполняются дольше, чем TTR, поэтому он возвращался в очередь и принимался другим работником.

Сейчас я установил больший TTR на работе.

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