У меня проблема с работниками Gearman, работающими на нескольких серверах, которую я не могу решить.
Проблема возникает, когда рабочий сервер переводится в автономный режим, а не отменяется рабочий процесс, и приводит к ошибкам и сбоям всех других рабочих процессов.
Пример только с 1 клиентом и 2 работниками -
Клиент:
$client = new GearmanClient ();
$client->addServer ('192.168.1.200');
$client->addServer ('192.168.1.201');
$job = $client->do ('generate_tile', serialize ($arrData));
рабочий:
$worker = new GearmanWorker ();
$worker->addServer ('192.168.1.200');
$worker->addServer ('192.168.1.201');
$worker->addFunction ('generate_tile', 'generate_tile');
while (1)
{
if (!$worker->work ())
{
switch ($worker->returnCode ())
{
default:
echo "Error: " . $worker->returnCode () . ': ' . $worker->error () . "\n";
break;
}
}
}
function generate_tile ($job) { ... }
Рабочий код запускается на 2 отдельных серверах. Когда каждый сервер включен и работает, оба работника выполняют задания, как и ожидалось. Когда один из рабочих процессов отменяется, другой рабочий выполняет все задания, как ожидалось.
Однако, когда сервер с отмененным рабочим процессом выключен и полностью отключен, запросы к клиентскому сценарию зависают, а оставшийся рабочий процесс не получает никаких заданий.
Я получаю следующий набор ошибок от оставшегося рабочего процесса:
Error: 46: gearman_con_wait:timeout reached
Error: 46: gearman_con_wait:timeout reached
Error: 4: gearman_con_flush:write:110
Error: 46: gearman_con_wait:timeout reached
Error: 4: gearman_con_flush:write:113
Error: 4: gearman_con_flush:write:113
Error: 4: gearman_con_flush:write:113
....
Когда я запускаю другой сервер, не запуская на нем рабочий процесс, оставшийся рабочий процесс немедленно переходит в жизнь и выполняет все оставшиеся задания.
Мне кажется, что мне нужен некоторый код в рабочем процессе, чтобы справиться с любыми серверами, которые могут быть отключены, однако я не могу понять, как это сделать.
Большое спасибо,
Andy