swoole websocket server集群怎么做?

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

阅读 9.9k
7 个回答

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

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

感谢各位!

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

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

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

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

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)

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

思路:

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

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

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

首先你要了解问题的本质是你不在同一个进程空间里(当然在不同的服务器上),你无法直接通讯,因为无法共享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里具体的某连接,然后直接发送消息就好了
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题