Gearman Workers периодически отключаются

Я использую сервер заданий Gearman с несколькими работниками, которым звонят несколько раз в день (10 000+ в час) без каких-либо проблем.

Недавно я добавил 3 новых воркера, которым звонят не так часто (3-6 раз в день). Кажется, что новые работники отключаются от сервера gearman, что кажется случайным (иногда раз в день, иногда после того, как они закончат работу), но оставляют процесс PHP запущенным, что означает отсутствие ФАТАЛЬНЫХ ошибок, они становятся недоступными только когда редукторные рабочие.

Журнал ошибок в основном правильный, однако я увидел следующее предупреждение в одном из журналов: Предупреждение: GearmanWorker::work(): flush(Время ожидания подключения истекло) send -> libgearman/connection.cc:847

Не нашел ничего по этому поводу и хотел задать пару вопросов:

1) К чему относится эта ошибка? тайм-аут работника, т. е. работа заняла слишком много времени? или тайм-аут сервера означает, что он бездействовал так долго, что отключился от сервера Gearman? Можно ли что-то исправить, установив GearmanWorker::setTimeout в -1?

1.1) Если я не устанавливаю тайм-аут явно, есть ли тайм-аут по умолчанию для Gearman?

2) Должны ли рабочие шестерни периодически перезапускаться?

3) Может ли это быть связано с возвращаемым значением работника? Я всегда возвращаю логическое значение, будет ли «ложь» отключать сервер?

Примечание. В отличие от других моих воркеров, эти воркеры вызываются клиентами как «фоновые».

Спасибо за любую помощь!


person Daniel Alonso    schedule 31.03.2014    source источник
comment
После обнаружения такой ошибки подключения вы пытались повторить попытку подключения?   -  person Rana    schedule 04.04.2014
comment
Нет, это что-то, что мне нужно настроить на рабочих? Я попробую и отчитаюсь.   -  person Daniel Alonso    schedule 06.04.2014


Ответы (1)


Сам недавно столкнулся с этой проблемой и не нашел решения. Думал, что опубликую свое исправление, чтобы следующий человек нашел эту страницу. В рабочем коде я добавил проверку цикла while на условие тайм-аута и заставил его выйти из скрипта:

while($worker->work() || $worker->returnCode() == GEARMAN_TIMEOUT)
{
  if($worker->returnCode() == GEARMAN_TIMEOUT)
  {
    echo "Timeout.\n";
    exit(0);
  }

}

Затем я поддерживаю рабочий сценарий в Supervisor. Когда процесс супервизора обнаруживает, что сценарий умер, он автоматически запускает его снова. Больше нет проблем с отключением рабочих. Это не очень элегантно, но со своей задачей справилось.

person Kris Peeling    schedule 08.09.2015
comment
Я запускаю воркер через cli, и если есть, то как вы будете запускать 50-100 воркеров? - person Naveen Agarwal; 07.02.2017
comment
@Naveen Agarwal PHP-скрипт сам по себе является рабочим, поэтому вы настраиваете супервизор для запуска нескольких копий вашего PHP-скрипта. Пока у вас достаточно оперативной памяти и процессора, вы можете запускать столько, сколько хотите. CLI хорош для тестирования одного воркера, но вам понадобится такой инструмент, как супервизор, чтобы запускать 50-100 одновременно. - person Kris Peeling; 08.02.2017