WebSocket 系列之 ws

导语 上篇说了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,如下图:

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

[Go语言]一种用于网游服务器的支持多路复用的网络协议处理框架

简介: 本文描述了使用Go语言实现的、适应于Go语言并发模型的一种支持多路复用的网络协议处理框架,并提供了框架的代码实现。作者将这种框架用于网络游戏服务器中的协...

34910
来自专栏魏琼东

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET平台开发指南 - 开发流程

过程介绍          AgileEAS.NET平台基于敏捷并行开发的一种实践,采用优秀先进的Microsoft .Net构件技术的插件式开发,AgileE...

20410
来自专栏扎心了老铁

Python Redis pipeline操作

Redis是建立在TCP协议基础上的CS架构,客户端client对redis server采取请求响应的方式交互。 一般来说客户端从提交请求到得到服务器相应,需...

4398
来自专栏前端杂货铺

node服务的监控预警系统架构

需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作。不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定...

2857
来自专栏PHP技术

揭秘Node.js深受欢迎的原因

Node.js是一项服务器技术,它用来构建和运行Web应用,这和ASP.NET,Ruby on Rails或Spring框架做的工作是类似的。它 使用JavaS...

3014
来自专栏技术分享

封装RabbitMQ.NET Library 的一点经验总结

这篇文章内容会很短,主要是想给大家分享下我最近在做一个简单的rabbitmq客户端类库的封装的经验总结,说是简单其实一点都不简单。为了节省时间我主要按照Libr...

2396
来自专栏无题

软负载中心与集中配置管理

软负载中心两个最基础的职责 聚合地址信息 生命周期感知->需要能对服务的上下线自动感知,并且根据这个变化去更新服务地址数据 软负载中心两个最基础的职责 聚合...

2824
来自专栏歪先生_自留地

通信协议初选之MQTT

681
来自专栏土豆专栏

计算机网络基础知识整理--运输层

从IP层来说,通信的两端是两个主机。IP数据报的首部明确地标志了这两个主机的IP地址。我们需要知道,真正进行通信的实体是在主机中的进程,是这个主机中的一个进程和...

60412
来自专栏IT大咖说

打开API网关设计的一扇窗

摘要 API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。 ? ...

3946

扫码关注云+社区