swoole websocket server集群怎么做?

发布于 2022-09-11 15:59:48 字数 123 浏览 28 评论 0

1,swoole websocket集群如何做到自动轮换,保证可靠性
2,swoole websocket server集群中,如何让 server1 的client A 向 server2 的 client B 推送 信息?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

转角预定愛 2022-09-18 15:59:48

首先你要了解问题的本质是你不在同一个进程空间里(当然在不同的服务器上),你无法直接通讯,因为无法共享tcp连接或无法直接操作相应的tcp连接

现假如你有个集群里面有同样服务的多机子(每天当成一个工作进程):A和B
现在你想A里的某连接(某客户)向B里的某连接(某客户)通讯的思路:

  1. 启动一台服务器M
  2. 在A和B的启动进程里,开启一个连接M的客户端(分别我们叫C1,C2),并监听事件
  3. A里的某连接(某客户)发送消息A服务器,A服务器处理相关的B标识用户数据, 转交给C1,然后C1发送消息给M服务器
  4. 然后M服务器,发送消息给所有的连接的客户端(当然这里如果你做了相应的用户标识,识别到了C2, 直接发送消息给C2就可以了)
  5. M发送消息给C2,然后C2根据标识查找到B里具体的某连接,然后直接发送消息就好了
樱桃奶球 2022-09-18 15:59:48

1.前面加个nginx啊,nginx支持websocket反向代理的,同时nginx也支持负载均衡,由nginx决定访问那个服务器
2.消息推送,简单的可以用nsq,需要功能多的就用mq,这两个都很稳定,而且支持集群

皓月长歌 2022-09-18 15:59:48

我随便回答一下,没做过类似的,就是思考了一下大致想法,不一定正确,肯定还有很多问题

思路:

存储用户会话信息,储存用户ID、server编号、fd

当你要发送给某个用户时,根据用户ID,去查server编号和fd。和指定server通信,指定server再将数据推送给指定fd

活泼老夫 2022-09-18 15:59:48
clientA --> server1 | send msg to clientB
            server1 | Find clientB at server2 (hash / radis / broadcast)
            server1 | connect server2 as websocket client
server1 --> server2 | msg to clientB from clientA
server2 --> clientB | receive msg from clientA

同服务器消息 和 不同服务器消息 结构上应该是不同的
类似魔兽跨服务器消息

[from A:to B:msg] A(server1) => B(server1)
[from A@1:to B@2:msg] A(server1) => B(server2)
〃安静 2022-09-18 15:59:48

uid+serverip+fd是否可以实现?

红衣飘飘貌似仙 2022-09-18 15:59:48

谢邀 .
首先说下我自己是没有搞过ws集群的 , 不过有兴趣回答一下 .
一般说来 , 无论是tcp还是ws(当然ws本质上就是tcp)将信息主动push出去 , 靠的是fd文件描述符 . server1的clientA应该是在server1上有自己的文件描述符 , server2的clientB在server2上也有自己的文件描述符 . 这个你应该是明白的 .

我认为你是可以通过某种方案来确定"ClientA的长链接在server1上,clientB的长链接在server2上"的 , 比如你可以通过hash或者uid取余这种方式来确定某个用户将会与某个服务器建立长链接 . 只要这点确定了 , 你就可以将"发送给clientB的消息"也通过这个方式来落到clientB建立长链接的服务器上 , 然后这会儿你就可以很自然的通过这台服务器利用fd将消息push给clientB了.

应该会有更好的解决方案 . 关注.

秋千易 2022-09-18 15:59:48

首先,感谢各位技术专家提供的答案和思路,?。

实际中我发现原生Swoole对Cluster并不支持,然后研究了蛮久的SwooleDistributed,但是它需要配合Consul,这个配置也是及其麻烦的,最终都放弃了,选择了原生支持Cluster的Workman,支持异步MySQL,异步Redis,暂时项目就是用这个,后期也会继续跟进Swoole对Cluster的支持。

感谢各位!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文