提到负载均衡,首先想到的就是nginx,但是它毕竟是个反向代理,客户端先连上nginx,然后经过负载均衡策略在连上目标服务器,然后要取消超时,显然连接都还是在nginx上,只是业务实现了负载均衡。所以这种方式不可取,也不好扩展,毕竟一台nginx的长连接数也是有上限的。
1、连接
客户端发起连接之前首先请求一个中心的 http server
,此服务会根据客户端的IP地址,选择最近的且负载最小的ws server
地址,客户端再发起ws连接,这样就实现了连接的负载均衡和优化。甚至当用户从新疆来到海南,我们可以让它切换到海南的ws。因此这种方式扩展性很好,非常灵活。
客户端连接成功后,ws就要将userid, ws_ip
存储到数据库中。
2、发送数据
消息的收发采用消息队列,其中每一个 ws_ip
对应一个 topic
。
比如向 user1 发送数据,首先找到 user1 连接在哪个ws,然后将消息推送到对应的topic
。
如果 user1 不在线,就发送到通用的topic0
,显然 topic0 也需要有多个,比如 topic0_0, topic0_1
,防止单个 topic 太大。
3、接收消息
ws拉取自己的 topic 消息,并发送到 user1,如果发现 user1 并不在自己这里,说明 user1 已经断开连接,这个时候,先找到 user1 连接在哪台ws,将消息投递到对应的 topic,如果没有找到投递到 topic0。文章来源:https://www.toymoban.com/news/detail-613800.html
4、消费topic0
使用另一个程序来消费 topic0,找到 user1 连接在哪台ws,将消息投递到对应的 topic,如果没有找到投递到 topic0。如果 user1 长时间都不连接,比如7天,那么就将消息存储在数据库A,减少无用的轮训,但是,当 user1 突然某一天连上了,那么ws应该发起一个任务将数据库A中 user1 的消息投递到对应的 topic。文章来源地址https://www.toymoban.com/news/detail-613800.html
到了这里,关于websocket如何做负载均衡的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!