Gearman с несколькими серверами и php worker

У меня проблема с рабочими механизмами, работающими на нескольких серверах, которую я не могу решить.

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

Пример с 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
....

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

Мне кажется очевидным, что мне нужен некоторый код в рабочем процессе, чтобы справиться с любыми серверами, которые могут быть отключены, однако я не вижу, как это сделать.

Большое спасибо,

] Энди

10
задан Andy Burton 16 August 2011 в 09:35
поделиться