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