websocket集群搭建方案

1.前言

我们都知道http协议,http属于短链接,属于一个request对应一个response,但是而且请求后就必须有响应。后来http增加了Keep-Alive,当增加这个属性的时候可以允许模拟http分片传输数据,但是即使是这样也是一个request对应一个response。

假设有个业务想要连接不断,并且更加自由,那么就得用websocket协议。本编文章讲述搭建websocket集群的架构。

2.技术

本文讲述的架构所需要的技术点:nginx、websocket、redis、rocketmq、linux简单的命令。学习过这些技术又便于更好的了解本文所述的内容。

3.技术架构图

websocket集群搭建方案_第1张图片

4.具体步骤解析

如图所示:

  • redis与spring建立session共享,redis对于每个服务器都是可读可写的,这样session就是唯一的,每个终端都具备一个session。
  • 终端首先通过nginx负载均衡映射到服务器,建立websocket连接,假设连接建立在第一个服务器上,那么就会生成一个session,当前session就可以代表此终端,在此终端会有一个位置,在这里通过ip代表,将session与ip纪录在redis中,这样每个服务器都能找到。(注意:此时的ip代表的当前建立连接的服务器的ip和端口,也是下文提到的location。)
  • 当有用户发送一条指令的到了websocket server1时,server1会先去redis中查看与终端建立的连接在哪,此时location就是自己,因此server1直接将指令发送给终端。
  • 当有用户发送指令到server2、server3中,server2和server3也会去redis中查看location,结果建立的连接在server1,那么通过rocketmq将指令发送给server1,当server1接收到指令后,会将该指令发送给终端。以下是配套流程图,以便于理解。

websocket集群搭建方案_第2张图片

5.如果服务器发生宕机

第一种,当server1有存在websocket连接,server1挂起了怎么办?这就需要终端具有重试机制了,当没有收到服务器主动推的关闭指令,终端可以重新与server2或者server3进行重连。

第二种,当server1存在websocket连接,而指令又在server2上,而server2挂起了怎么办,消息不就得丢失了吗?
推荐一种方案,可以利用redis的key失效监听器,当指令到了服务器可以将指令缓存下来,并且设置一个失效时间,当server2挂起了,这是redis的key失效时间到了,redis就会把这条指令发送给其它服务器,任何一个服务器收到了之后可以再次判断websocket连接的ip,再将指令通过正确的服务器给终端。

6.结语

以上就是搭建websocket集群的架构的一种方案,本文所述紧供参考与讨论。

你可能感兴趣的:(websocket)