Gearman与多个服务器和PHP工作者

And*_*ton 10 php 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));
Run Code Online (Sandbox Code Playgroud)

工人:

$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) { ... }
Run Code Online (Sandbox Code Playgroud)

工作器代码在两个单独的服务器上运行.当每个服务器启动并运行时,两个工作程序都按预期执行作业.当其中一个工作进程被取消时,另一个工作程序按预期执行所有作业.

但是,当具有已取消的工作进程的服务器关闭并完全脱机时,对客户端脚本的请求将挂起,并且剩余的工作进程不会获取任何作业.

我从剩余的工作进程中得到以下一组错误:

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
....
Run Code Online (Sandbox Code Playgroud)

当我启动另一台服务器而不启动其上的工作进程时,剩余的工作进程会立即跳入生命并执行任何剩余的作业.

我似乎很清楚,我需要在工作进程中使用一些代码来处理可能处于脱机状态的任何服务器,但我无法看到如何执行此操作.

非常感谢,

安迪

Max*_*sky 6

我们使用多个gearman服务器进行的测试表明,如果列表中的最后一个服务器(在您的情况下为192.168.1.201)被删除,则工作人员将停止执行您描述的方式.(此外,工作人员从最后一台服务器获取作业.只有在.201没有工作时才会处理.200上的作业).

似乎这是齿轮箱服务器中链接列表的一个错误,据报道它被修复了多次,但是对于所有可用版本的gearman,错误仍然存​​在.对不起,我知道这不是一个解决方案,但是我们遇到了同样的问题并没有找到解决方案.(如果有人可以为这个问题提供工作解决方案,我同意给予大额奖励)

  • 有意思,谢谢.我已经更改了服务器的顺序,以便我关闭的工作服务器是第一个服务器而不是最后一个服务器,虽然仍然生成了一些错误,但工作人员确实正确处理了作业.我建议解决这个问题的方法是在客户端服务器上运行一个worker并将其设置为最后一个服务器.这样,如果任何工作服务器出现故障,那么这不是问题,一切正常,因为它们都不是最后添加的服务器,但如果工作服务器/客户端服务器出现故障,那么客户端无论如何都会关闭,因此没有新的工作可以被处理. (2认同)