GatewayWorker速度很慢

bengore

大佬,GatewayWorker和GatewayClient在百度云的不同服务器,通过内网IP连接,每次打开页面都要等5秒左右的时间,就算一个客户端都没有,也是要等很久,有可能是什么原因呢?

在GatewayClient服务器上ping GatewayWorker服务器 速度少于1ms

4980 5 0
5个回答

walkor

如果GatewayClient和GatewayWorker不是在同一台服务器上,则需要先将start_gateway.php中的lanIp改成当前服务器的内网ip(如果不在一个内网可改成公网ip)。注意,无论何时lanIp都不能写成0.0.0.0,否则将无法通讯。
如果GatewayClient和GatewayWorker不是在同一台服务器上,还要设置防火墙(云服务器的话还要设置安全组)让以下端口可以被GatewayClient所在服务器访问:
1、start_gateway.php中的$gateway->startPort起始的几个端口(要开放的端口个数和$gateway->count有关)。
2、start_register.php中的Register服务端口 反之如果GatewayClient和GatewayWorker在同一台服务器上运行,则不用做任何更改,直接按照示例使用GatewayClient即可。

摘自手册 http://doc2.workerman.net/push-in-other-project.html

  • bengore 2018-11-30

    start_gateway.php:

    // gateway 进程,这里使用Text协议,可以用telnet测试
    $gateway = new Gateway("tcp://0.0.0.0:8282");
    // gateway名称,status方便查看
    $gateway->name = 'YourAppGateway';
    // gateway进程数
    $gateway->count = 4;
    // 本机ip,分布式部署时使用内网ip
    $gateway->lanIp = '172.16.0.5';
    // 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
    // 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
    $gateway->startPort = 2900;
    // 服务注册地址
    $gateway->registerAddress = '127.0.0.1:1238';

    start_register.php:
    use \Workerman\Worker;
    use \GatewayWorker\Register;

    // 自动加载类
    require_once __DIR__ . '/../../vendor/autoload.php';

    // register 必须是text协议
    $register = new Register('text://0.0.0.0:1238');

    // 如果不是在根目录启动,则运行runAll方法
    if(!defined('GLOBAL_START'))
    {
    Worker::runAll();
    }

    GatewayClient的业务页面用了查询客户端是否在线:

    Gateway::bindUid($client_id, $macaddress);
    if( !Gateway::isUidOnline($macaddress) ){
    $online = '<span class="offline">不在线</span>';
    }else{
    $online = '<span class="online">在线</span>';
    }

    GatewayClient的业务页面每次打开都load比较久才能看到客户端的在线情况,而且曾经登陆过客户端数量越多,load的时间也越久,目前5个客户端登陆过,等大概6s,如果以后几百上千,那不是完蛋了。

bengore

原来是Gateway::bindUid()这句出现问题,去掉这句绑定Uid,直接用Gateway::isOnline()查询,马上就快了,绑定Uid为什么会这么耗时呢?

  • 暂无评论
walkor

我贴的第1点防火墙安全组那里看下做了没?你的配置对应的端口应该是2900 2901 2902 2903,请检查下。
手册上的注意事项请务必确认检查,这样你会很省时间

  • bengore 2018-12-01

    其实都有的,因为是在测试阶段,防火墙关闭,安全组是全放开的,但就是绑定Uid特别耗时,我是在同一个页面绑定多个Uid,然后查询一个个Uid的在线状态的

  • bengore 2018-12-01

    后来不用绑定Uid,直接通过clientid查询在线状态,马上就快了

  • walkor 2018-12-01

    进入到bindUid函数里找下看下那行代码执行的慢

  • bengore 2018-12-03

    @1:今天调试了下,发现原来是isUidOnline($uid);这句慢,getBufferFromAllGateway($gateway_data);因为调用了这个function。

bengore

今天调试了一下,发现在GatewayClient的Gateway.php里面,耗时的是isUidOnline($uid);这句,
isUidOnline($uid);调用getClientIdByUid($uid);
getClientIdByUid($uid);调用getBufferFromAllGateway($gateway_data);
来到getBufferFromAllGateway($gateway_data);就很慢了,基本上查询一个Uid差不多1秒钟,查询n个就是n秒钟。
getBufferFromAllGateway($gateway_data);这个function,好复杂,就没继续看下去了。
 

[attach]1471[/attach]
 

  • walkor 2018-12-03

    看下register的1238端口安全组和防火墙开了没。
    在gatewayClient上 telnet ip 1238 看下能否连上

  • bengore 2018-12-03

    在gatewayClient上 telnet ip 1238 可以连上

bengore

[attach]1472[/attach]
 

  • 暂无评论
年代过于久远,无法发表回答
🔝