在该连接完成之后,我们将连接存放到一个名为Client的map中 , 以便之后管理更为方便 。
之后,我们启动一个goroutine来读取连接中发送的信息内容 , 再根据内容进行相应的操作 。
WebSocket+SLB(负载均衡)会话保持解决重连问题写在最前面:由于现在游戏基本上采用全球大区的模式,全球玩家在同一个大区进行游戏,传统的单服模式已经不能够满足当前的服务需求,所以现在游戏服务器都在往微服务架构发展 。当前我们游戏也是利用微服务架构来实现全球玩家同服游戏 。
玩家每次断线(包括切换网络/超时断线)后应该会重新连接服务器,重连成功的话可以继续当前情景继续游戏 , 但是之前写的底层重连机制一直不能生效 , 导致每次玩家断线后重连都失败,要从账号登陆开始重新登陆,该文章写在已经定位了重连问题是由SLB引起后,提出的解决方案 。
每次重连后,客户端向SLB发送建立连接,SLB都会重新分配一个网关节点,导致客户端连接到其他网关,重连失败 。
会话保持的作用是什么?
开启SLB会话保持功能后,SLB会记录客户端的IP地址,在一定时间内,自动将同一个IP的连接转发到上次连接的网关 。
在网络不稳定的情况下,游戏容易心跳或者发包超时,开启会话保持,能解决大部分情况下的重连问题 。
但是在切换网络的时候,手机网络从Wifi切换成4G,自身IP会变 , 这时候连接必定和服务器断开,需要重新建立连接 。由于IP已经变化 , SLB不能识别到是同一个客户端发出的请求,会将连接转发到其他网关节点 。所以使用TCP连接的情况下,SLB开启会话保持并不能解决所有的重连问题 。
另外某些时刻,手机频繁开启和断开WI-FI,有时候可能不会断开网络 , 这并不是因为4G切换WI-FI时网络没断开,从4G切换到Wi-Fi网络,因为IP变了,服务器不能识别到新的IP,连接肯定是断开的 。这时候网络没断开,主要是因为现在智能手机会对4G和Wi-Fi网络做个权重判断,当Wi-Fi网络频繁打开关闭时,手机会判断Wi-Fi网络不稳定,所有流量都走4G 。所以网络没断开是因为一直使用4G连接,才没有断开 。想要验证,只需要切换Wi-Fi时,把4G网络关闭,这样流量就必定走Wi-Fi 。
上面说过,四层的TCP协议主要是基于IP来实现会话保持 。但是切换网络的时候客户端的IP会变 。所以要解决切换网络时的重连问题 , 只有两个方法:1. 当客户端成功连接网关节点后,记录下网关节点的IP,下次重连后不经过SLB,直接向网关节点发送连接请求 。2.使用 SLB的七层(HTTP)转发服务 。
当客户端经过SLB将连接转发到网关时 , 二次握手验证成功后向客户端发送自己节点的IP,这样客户端下次连接的时候就能直接连接网关节点 。但是这样会暴露网关的IP地址,为安全留下隐患 。
如果不希望暴露网关的IP地址,就需要增加一层代理层,SLB将客户端请求转发到代理层,代理层再根据客户端带有的key,转发到正确的网关节点上 。增加一层代理层,不仅会增加请求的响应时间,还会增加整体框架的复杂度 。
阿里云的七层SLB会话保持服务,主要是基于cookie的会话保持 。客户端在往服务器发送HTTP请求后,服务器会返回客户端一个Response , SLB会在这时候,将经过的Response插入或者重写cookie 。客户端获取到这个cookie,下次请求时会带上cookie,SLB判断Request的Headers里面有cookie,就将连接转发到之前的网关节点 。
HTTP是短链接,我们游戏是长连接,所以用HTTP肯定不合适 。但是可以考虑基于HTTP的WebSocket 。
推荐阅读
- 射击潜入游戏,潜伏射击类游戏
- 公众号怎么找到小编码呢,微信公众号代码怎么找
- 盈通显卡7300怎么样,盈通显卡7300怎么样啊
- linux进程终止的命令 linux终止进程命令带什么参数
- cpu和emc是什么,emc和pct的区别
- 关于postgresql排序分页的信息
- 阿里云服务器普通,阿里云服务器用处
- gcgo语言 go语言gtk
- mysql索引长什么样,mysql索引是啥