我在多个服务器上运行的 gearman 工作人员遇到了问题,我似乎无法解决。
当工作服务器脱机而不是工作进程被取消时,就会出现此问题,并导致所有其他工作进程出错和失败。
仅 1 个客户和 2 个工作人员的示例 -
Client:
$client = new GearmanClient ();
$client->addServer ('192.168.1.200');
$client->addServer ('192.168.1.201');
$job = $client->do ('generate_tile', serialize ($arrData));
Worker:
$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) { ... }
工作代码在两台独立的服务器上运行。当每台服务器启动并运行时,两个工作线程都会按预期执行作业。当其中一个工作进程被取消时,另一个工作进程将按预期执行所有作业。
但是,当已取消工作进程的服务器关闭并完全脱机时,对客户端脚本的请求将挂起,并且剩余的工作进程不会获取任何作业。
我从剩余的工作进程中收到以下一组错误:
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