背景
微信小游戏、Facebook小游戏等基于HTML5的网页游戏采用的是WebSocket协议,而现在平台提供的聊天服务采用的是TCP连接,协议不一致,需要解决。
方案
在客户端和聊天服之间搭建一个代理,命名为e-ws. 其作用是将客户端到代理的WebSocket连接升级为TCP连接,同时建立一个代理至聊天服之间的TCP连接,使客户端与聊天服之间的信息互通,从而达到H5客户端连接聊天服的目的。
配置
代理e-ws的配置包括以下几部分。
AWS配置
环境 | ALB | 侦听器协议/端口 | 目标组 | 服务域名 | 完整服务地址 | 协议/端口 |
---|---|---|---|---|---|---|
Beta | beta | HTTPS 443 | beta-e-ws-tg | e-ws-beta.x.com | wss://e-ws-beta.x.com:443 | HTTP/x |
Gold | gold | HTTPS 443 | e-ws-tg | e-ws.x.com | wss://e-ws.x.com:443 | HTTP/x |
Nginx配置
由于客户端是采用WebSocket协议连接代理服务器e-ws, 需要确认连接e-ws服务的客户端IP所在地理位置(国内或国外,可能有误判)。当客户端IP被判定是在国外时,就直连代理服务器;但当客户端IP被判定在国内时,就会通过ALB走加速通道。默认设置在进入ALB时的Nginx是不支持WebSocket协议的,会将webso的请求头字段(Connection: upgrade、Upgrade: websocket)丢弃,导致该请求到达e-ws后被判定为非WebSocket协议,返错至客户端。解决方式就是在对应的Nginx配置文件内添加以下设置:
添加内容 |
---|
proxy_set_header Upgrade $http_upgrade; |
proxy_set_header Connection "upgrade"; |
空闲超时/心跳检测
现有的客户端SDK都做了与聊天服务器之间的心跳检测,每30秒发送一次心跳包。
在-ws代理服务所在的ALB上,有一项属性名为“空闲超时”,当前设置为60秒。也就是说如果客户端或服务器60秒内没有数据传输,则该连接会被ALB主动断开。在搭建起e-ws服务后采用简单的网页进行Websocket连接测试时,可以观察到WebSocket连接建立后1分钟内如果不发送消息至服务器,该链接就会断开。