Подтвердить что ты не робот

Исправлены ошибки и повторы в редукторе?

Может ли кто-нибудь направить меня на то, как ретранслятор делает повторные попытки, если исключения брошен или когда возникают ошибки?

Я использую клиента python gearman в приложении Django, и мои работники инициируется как команда Django. Я прочитал из этого сообщения в блоге, который повторяет из условий ошибки не являются прямыми и что это требует sys.exit со стороны рабочего.

Было ли исправлено повторение, возможно, с помощью sendFail или sendException? Также репликатор поддерживает повторы с алгоритмом экспоненциальности - скажем, если сбой SMTP происходит после повторных попыток после 2,4,8,16 секунд и т.д.?

4b9b3361

Ответ 1

Насколько я понимаю, Gearman использует подход "не мой бизнес" - например, он не вмешивается в выполнение заданий, если только рабочие не сработают. Любые сообщения об успешности/сбое должны обрабатываться клиентом, а не самим сервером Gearman.

В задачах переднего плана это означает, что все sendFail()/sendException() и другие send*() направляются клиенту, и это зависит от клиента, чтобы решить, следует ли повторить задание или нет. Это имеет смысл, поскольку иногда вам не нужно повторять попытку.

В фоновых заданиях все функции send*() теряют свое значение, так как нет клиента, который будет слушать обратные вызовы. В результате отправленные сообщения будут просто проигнорированы Gearman. Единственное условие, на которое будет выполняться задание, - это когда рабочий сбой (который может быть эмулирован командой exit(XX), где XX - ненулевое значение). Это, конечно, не то, что вы хотите сделать, потому что обычно работники обычно являются длительными процессами, а не теми, которые необходимо перезапустить после каждой неудачной работы.

Лично я решил эту проблему, расширив класс GearmanJob по умолчанию, где я перехватываю вызовы на функции send*(), а затем сам реализую механизм повтора. По сути, я передаю все связанные с повторением данные (максимальное количество повторных попыток, время, уже повторенное) вместе с рабочей нагрузкой, а затем обрабатывает все сам. Это немного громоздко, но я понимаю, почему Gearman работает таким образом - он просто позволяет вам обрабатывать всю логику приложения.

Наконец, в отношении возможности повторной работы с экспоненциальным таймаутом (или любым таймаутом, если на то пошло). У Gearman есть функция добавления замедленных заданий (посмотрите SUBMIT_JOB_EPOCH в документации по протоколу ), но я не уверен в ее статусе - расширении PHP и, я думаю, модуль Python не поддерживает его, и документы говорят, что его можно удалить в будущем. Но я понимаю, что это работает в данный момент - вам просто нужно отправить сырые запросы сокетов на Gearman, чтобы это произошло (и экспоненциальная часть также должна быть реализована на вашей стороне).

Однако этот пост в блоге утверждает, что реализация SUBMIT_JOB_EPOCH не очень хорошо масштабируется. Он использует node.js и setTimeout(), чтобы заставить его работать, я видел, как другие используют утилиту unix at, чтобы сделать то же самое. В любом случае - Гирман не сделает это за вас. Он будет сосредоточен на надежности, но позволит вам сосредоточиться на всей логике.