ws分布式部署sendToGroup的疑问

Kula

问题描述

我有两台服务器A和B,都部署了webman,并且使用gateway worker提供ws服务,A和B都有gateway、register、gateway worker几种进程,register是相互注册的。现在我想在A中向B的ws用户组发送消息。

截图

我在A的http接口中使用了gateway client包,register address 填写的是A的register地址:127.0.0.1:1236,但是消息无法推送到B服务器的ws用户

我看了源码,按照我的理解,A的register 进程里面应该也是保存了B的gateway地址的,难道我gateway client的register address要写两个吗:A:1236,B:1236,但是看源码这样写是没有意义的,该怎么做呢?

376 4 1
4个回答

Gin

registerAddress为 ['192.168.0.1:1236','192.168.0.2:1236']

  • Kula 2023-10-18

    这样不行的,下面是他里面的方法,它只取了其中一个地址,我试过了:
    foreach ($register_addresses as $register_address) {
    set_error_handler(function(){});
    $client = stream_socket_client('tcp://' . $register_address, $errno, $errmsg, static::$connectTimeout);
    restore_error_handler();
    if ($client) {
    break;
    }
    }
    if (!$client) {
    throw new Exception('Can not connect to tcp://' . $register_address . ' ' . $errmsg);
    }

  • Gin 2023-10-18

    AB 1236能互通不

  • Kula 2023-10-19

    可以的

小W

registerAddress 可以修改,推送给A后修改为B的注册地址不可以?或者使用内部通讯端口也行

  • 暂无评论
keytehu

如果A和B是一个集群,getewayClient调用是写任何一个register地址即可。不是一个集群就要设置对应的registerAddress

  • 暂无评论
meows

讲道理可以互相通信,你看那张图,但是你注册中心不能写127.0.0.1,要写两台webman 其中一台的内网IP地址吧!
举个例子,nginx 192.168.1.5, webman1 192.168.1.6:8002, webman2 192.168.1.7:8003;
这时候GatewayClient::$registerAddress = ["192.168.1.7:9005"],当然GatewayWorker 网关服和逻辑服都要填写这个注册中心地址,不然无法通信。
这样两台服务器都填写这个IP就能相互通信,你127.0.0.1 肯定不行。

register 只有一个作用,登记逻辑服和网关服的ip:port,只要两台服务器的注册中心一个地址,肯定是共享的。
只是你写的127.0.0.1自然无法相互通信,相当于各是各的注册中心地址(也就是两个注册中心了)

  • Kula 2023-10-20

    问题解决了,大佬你说的是对的,要写成内网地址,然后gateway进程数都设置为1,就可以相互发送消息,并且不会发重。

  • yongdao35 2023-10-20

    然后gateway进程数不用特意设成1,它这个系统本来就是分布式的,可以多进程多服务器

🔝