接上一篇 负载均衡情况下 webman gateway-worker插件 随机一台机器投递消息失败

alex

上一篇文章

webman Gateway 阿里云负载均衡 后端机器一台能发消息 一台不能

这里有负载均衡配置说明 但是是基于workman的,没有提及到webman如何设置
https://www.workerman.net/doc/gateway-worker/how-distributed.html

正确的方法是

1. 打开文件配置文件

config/plugin/webman/gateway-worker/process.php

2. 假设我们有负载均衡2台 a机器内网ip是 192.168.0.1 b机器内网ip是192.168.0.2

a机器配置方法
特别注意:

  1. lanIp 设置当前a机器内网ip
  2. registerAddress 需要设置2台机器的ip
  3. worker 里的 registerAddress 需要设置2台机器的ip
  4. register listen text 也是a机器的内网ip
<?php

use Webman\GatewayWorker\Gateway;
use Webman\GatewayWorker\BusinessWorker;
use Webman\GatewayWorker\Register;

return [
    'gateway' => [
        'handler'     => Gateway::class,
        'listen'      => 'websocket://0.0.0.0:7272',
        'count'       => 2,
        'reloadable'  => false,
        'constructor' => ['config' => [
            'lanIp'           => '192.168.0.1',
            'startPort'       => 2300,
            'pingInterval'    => 25,
            'pingData'        => '{"type":"ping"}',
            'registerAddress'=>['192.168.0.1:1236','192.168.0.2:1236'],
            'onConnect'       => function(){},
        ]]
    ],
    'worker' => [
        'handler'     => BusinessWorker::class,
        'count'       => cpu_count()*2,
        'constructor' => ['config' => [
            'eventHandler'    => plugin\webman\gateway\Events::class,
            'name'            => 'ChatBusinessWorker',
            'registerAddress' => ['192.168.0.1:1236','192.168.0.2:1236'],
        ]]
    ],
    'register' => [
        'handler'     => Register::class,
        'listen'      => 'text://192.168.0.1:1236',
        'count'       => 1, // Must be 1
        'reloadable'  => false,
        'constructor' => []
    ],
];


那么 b机器的配置

<?php

use Webman\GatewayWorker\Gateway;
use Webman\GatewayWorker\BusinessWorker;
use Webman\GatewayWorker\Register;

return [
    'gateway' => [
        'handler'     => Gateway::class,
        'listen'      => 'websocket://0.0.0.0:7272',
        'count'       => 2,
        'reloadable'  => false,
        'constructor' => ['config' => [
            'lanIp'           => '192.168.0.2',
            'startPort'       => 2300,
            'pingInterval'    => 25,
            'pingData'        => '{"type":"ping"}',
            'registerAddress'=>['192.168.0.1:1236','192.168.0.2:1236'],
            'onConnect'       => function(){},
        ]]
    ],
    'worker' => [
        'handler'     => BusinessWorker::class,
        'count'       => cpu_count()*2,
        'constructor' => ['config' => [
            'eventHandler'    => plugin\webman\gateway\Events::class,
            'name'            => 'ChatBusinessWorker',
            'registerAddress' => ['192.168.0.1:1236','192.168.0.2:1236'],
        ]]
    ],
    'register' => [
        'handler'     => Register::class,
        'listen'      => 'text://192.168.0.2:1236',
        'count'       => 1, // Must be 1
        'reloadable'  => false,
        'constructor' => []
    ],
];

在a机器投递消息的时候

Gateway::$registerAddress = '192.168.0.1:1236';
Gateway::sendToUid($uid, '我是a机器发送的消息');

在b机器投递消息的时候

Gateway::$registerAddress = '192.168.0.2:1236';
Gateway::sendToUid($uid, '我是b机器发送的消息');

至此结束,亲测有效

147 2 2
2个评论

稚出

学到了

  • 暂无评论
efnic

需要搞清楚 分布式部署集群部署 的区别。

官方文档 同一集群使用相同的一组Register服务

  • alex 2天前

    前置做了一致性hash的 负载均衡

alex

200
积分
0
获赞数
0
粉丝数
2022-12-01 加入
🔝