необъяснимая тайна тайм-аута Gearman

Клиент Gearman случайно отключается по таймауту при добавлении работы. Я не могу воссоздать условия, вызывающие сбой. Демон Gearman запущен!

Условия: загрузка пакета файлов в очередь в Gearman для изменения размера. Я могу загрузить сотни без ошибок. Тем не менее, время от времени отдельное задание не может быть отправлено со следующей ошибкой:

 gearman_wait(GEARMAN_TIMEOUT) timeout reached,
 1 servers were poll(), no servers were available, pipe:false ->
 libgearman/universal.cc:328

Тем не менее, вакансии, отправленные непосредственно до и после неудавшейся работы, проходят! Я даже могу повторно загрузить то же изображение, и оно будет выполнено со второй попытки. Сервер gearman есть ... это какой-то глюк с расширением gearmand или php-pecl-gearman ??

конфигурация gearmand:

OPTIONS="
--port=4730 \
--verbose=NOTICE \
--log-file=/var/log/gearman/gearmand.log \
--keepalive \
--threads=4 \
--queue-type=MySQL \
--mysql-host=localhost \
--mysql-port=xxx \
--mysql-user=xx \
--mysql-password=xx \
--mysql-db=xxxD \
--mysql-table=gearman_queue \
--job-retries=5"

Расширение PHP Gearman (PECL)

gearman support => enabled
extension version => 1.1.2
libgearman version => 1.1.8
Default TCP Host => localhost
Default TCP Port => 4730

Журналы показывают все принятые задания, ничего не отмечено для неудачных заданий.

NOTICE 2015-02-02 16:25:54.000000 [  proc ] accepted,worker_name,jobidprefix65468823354cfa51234fa09.3540767125336,0 -> libgearman-server/server.cc:314
 NOTICE 2015-02-02 16:25:56.000000 [  proc ] accepted,worker_name,jobidprefix40605707054cfa51438b0d0.383048589216,0 -> libgearman-server/server.cc:314
 NOTICE 2015-02-02 16:25:56.000000 [  proc ] accepted,worker_name,jobidprefix197198183754cfa51447dac9.5387112932157,0 -> libgearman-server/server.cc:314

Перед тем, как отправить задание, я даже проверяю связь с чертовым сервером gearman, чтобы убедиться, что он там есть! Результат пинга оказался верным !!

$gmclient= new GearmanClient();
$gmclient->addServer("127.0.0.1", ((int)$gearmanPort)); # Add default server (localhost).
$gmclient->setTimeout(300);//set timeout to send gearman errors

//assign a unique id for the job (limit the length to prevent db errors)
$uniqueid = substr('jobPrefix'.uniqid (rand (),true).rand(0, 32767), 0, 63); 

//add the job to the background
$job_handle = $gmclient->addTaskBackground("worker_name", $jobdata, null, $uniqueid); 

//ping gearman to make sure it is working before sending job
//keep trying for 2 seconds (4 times per second) until success or failure
$pingCount = 1;
while (@$gmclient->ping(serialize("Ping Test")) === FALSE && $pingCount <= 8) {
            $this->log('Couldnt ping gearman server on pingCount='.$pingCount.'/8');
            usleep(250000); //sleep for 0.25 seconds before trying again
            $pingCount++;
}

//queue the job
if (@!$gmclient->runTasks()) //supress gearman fatal errors so we can catch them
{
    throw new CHttpException(500,"ERROR " . $gmclient->error());
}

if (@$gmclient->returnCode() != GEARMAN_SUCCESS) //supress gearman fatal errors so we can catch them
{
        throw new CHttpException(500,'ERROR: Bad return code for brokenlinkcheck '.$gmclient->returnCode());
}

person dandan    schedule 02.02.2015    source источник


Ответы (1)


$gmclient->setTimeout(300);

Есть неприятная ошибка с тайм-аутом, когда она установлена ​​для рабочего на сервере заданий gearman. Вы также установили тайм-аут в рабочем скрипте? Попробуйте удалить это.

person Boris    schedule 20.04.2015