【发布时间】:2011-08-16 09:35:12
【问题描述】:
我遇到了在多台服务器上运行的 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
....
当我启动另一台服务器时,没有启动其上的工作进程,剩余的工作进程会立即启动并执行任何剩余的作业。
我似乎很清楚,我需要工作进程中的一些代码来处理任何可能离线的服务器,但是我不知道该怎么做。
非常感谢,
安迪
【问题讨论】: