Состояния ошибки и повторные попытки в редукторе? - PullRequest
12 голосов
/ 15 января 2012

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

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

Исправлено ли это, возможно, для повторной попытки с sendFail или sendException?Также Gearman поддерживает повторные попытки с алгоритмом экспоненты - скажем, если сбой SMTP происходит, его повторные попытки через 2,4,8,16 секунд и т. Д.

1 Ответ

25 голосов
/ 27 апреля 2012

Насколько я понимаю, в 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, чтобы сделать то же самое. В любом случае - Gearman не сделает это за вас. Он будет сосредоточен на надежности, но позволит вам сосредоточиться на всей логике.

...