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

alex

问题描述

webman Gateway 阿里云负载均衡 client id都是一致的情况下 后端机器一台能发消息 一台不能

用的是 gateway-worker插件 https://www.workerman.net/plugin/5

程序代码或配置

在onWebSocketConnect

  Gateway::bindUid($client_id,$User['id']);

在检查是否在线的时候

if(!Gateway::isUidOnline($GetToken['uid'])){
            return JsonOutput(
                Status::ERROR,
                '手机不在线推送失败',
                null
            );
        }

重现问题的步骤

  1. 请求socket链接
  2. 将clinet_id 写到 Gateway::bindUid 绑定
  3. 利用 Gateway::sendToUid($GetToken['uid'], json_encode(['mobile'=>$mobile]));
    会有一台机器 检测不在线

操作系统环境及workerman/webman等具体版本

  1. 阿里云clb负载均衡 tcp设置了 一致性hash
    截图
190 3 0
3个回答

efnic

建议绑定bindUid的时候,数据类型 强制转换为 string
你的问题引起的原因,就是 uid 数据类型不一致导致的。

efnic

或者简单点,直接安装我这个composer 包,两台不同的机器可以分别通过 各自的 .env 设置进程参数。

composer require ledc/gateway-worker

启动

常驻内存 可以 添加 -d

php webman gateway:worker start -d

停止

php webman gateway:worker stop

Env环境变量

GATEWAY_SECRET_KEY = 
GATEWAY_REGISTER_LISTEN_ADDRESS = 127.0.0.1
GATEWAY_REGISTER_ADDRESS = 127.0.0.1
GATEWAY_REGISTER_PORT = 1236
GATEWAY_LOCAL_IP = 127.0.0.1
GATEWAY_START_PORT = 4000
  • alex 2天前

    你好 我解决了 谢谢

  • efnic 1天前

    GatewayWorker通过Register服务来建立划分集群。同一集群使用相同的一组Register服务。
    你两台负载均衡的机器,都启动 Register服务 没必要吧?

efnic

分布式部署的关键步骤

  1. Register 设置为监听内网ip。为了安全起见,register端口不要暴露给外网。
  2. 将Gateway 和 businessWorker的注册服务地址(registerAddress)设置成统一的Register服务地址,如果是部署了多个register服务,格式类似['192.168.0.1:1236','192.168.0.2:1236']。
  3. 设置Gateway启动脚本(一般是start_gateway.php)中的lanIp与当前服务器内网ip一致。
  • 暂无评论
🔝