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