导语 上篇说了socket.io,这篇开始讲下ws库,如果说socket.io是大而全,那ws就是小而美
ws简介
1.纯WebSocket实现,不支持降级轮询,适用移动端开发
2.api简单易懂,client没有限制,可以用原生的
3.心跳检测,断线重连,多机多进程自由定制
ws server
说明:
1.因为没有降级使用轮询,也就没有一个socket连接由多次http request组成,所以多机多进程很好实现,跟http server一样
2.WebSocket server不能独立存在,必须绑在http server上,因为WebSocket建立连接依赖的http请求,如果你没有手动绑定,库里会自动创建一个http server
ws应用
背景:
去年微信小程序出来的时候,提供了WebSocket应用的api,但是WebSocket server端仍需要用户自己去搭建,门槛还是比较高的,鉴于此,腾讯云提供了一个打包方案,封装了技术细节(包括WebSocket),用户可以直接使用简单友好的sdk开发自己的小程序,这个打包方案里的WebSocket通道服务即由我负责开发实现。
选型:
因为小程序只在微信里打开,都是支持WebSocket的,无需降级使用轮询,所以我放弃了繁琐的socket.io,选择ws
架构图:
说明:
1.因为是多机多进程实现,每个进程都会监听一个私有端口,上图中的12801-12804,是为了实现广播功能,后面说明。
2.用户先调nodejs提供的cgi拉取带唯一id(作为信道id)的WebSocket url,再通过该url与nodejs建立连接,此时node会在cmem里存储该连接所在serve ip以及监听的私有端口,并通过业务服务器提供的cgi转发消息到业务服务器
3.如果要push消息,业务服务器调用nodejs提供的消息发送cgi,带上消息内容和要push的信道id,nodejs收到push 请求,从cmem中查询信道id所在server ip和私有port,将消息转发过去,WebSocket server 再调用对应WebSocket 连接将消息push到client
心跳检测:
1.server每隔10s发送心跳包给client,client即时发送响应包给server,server连续20s没有收到响应,则认为client退出了,server断开连接
2.client连续20s没有收到心跳包,认为连接失效,发起重连
广播:
1.根据tunnelId决定广播的信道
2.收到广播的server根据tunnelId通过私有端口转发广播内容到对应机器的worker进程
3.worker进程调用WebSocket连接句柄发送广播内容
STGW配置:
STGW作为统一接入层,在转发WebSocket请求时默认没有转发Connection:Upgrade和Upgrade:websocket header,这样server端接收到的就不是WebSocket请求了,所以我们必须在配置location时手动加上这两个header,如下图: