专栏首页肖乐的专栏WebSocket 系列之 ws
原创

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 条评论
登录 后参与评论

相关文章

  • WebSocket系列之socket.io

    上篇讲了WebSocket基础知识和浏览器端的实现,WebSocket server和http server也是有区别的,这篇开始讲nodejs平台的一个很成熟...

    肖乐
  • Spring Boot实现带STOMP的WebSocket

    WebSocket协议是应用程序处理实时消息的方法之一。最常见的替代方案是长轮询(long polling)和服务器推送事件(server-sent event...

    乱敲代码
  • 如何配置Spring Boot Tomcat

    Spring Boot Web应用程序默认包含预配置的嵌入式Web服务器。但在某些情况下,我们要修改默认配置以满足自定义要求。

    乱敲代码
  • 分布式文件系统之FastDFS文件服务器原理及搭建

    针对分布式开发,一个分布式文件系统就显得至关重要。今天主要讲讲FastDFS的搭建与实现。那么,什么是FastDFS呢?

    攻城狮的那点事
  • WebSocket服务器和客户端的一对多连接

    假设我有两个客户端连接了WebSocket服务器:我用下图两个Chrome tab表示:

    Jerry Wang
  • 如何在Tomcat中做TLS客户端认证

    常见的https网站做的是服务端认证(server authentication),浏览器通过证书判断你所访问的https://baidu.com是否真的是百度...

    颇忒脱
  • jquery操作元素的位置

    .offset()   在匹配的元素中,获取第一个元素的当前坐标,或设置每一个元素的坐标,坐标相对于文档。   .offset() 这个不接受任何参数。 ...

    用户1197315
  • CVPR2018 | 摆好Pose却没管理好面部表情?腾讯优图Facelet-Bank人脸处理技术了解一下

    机器之心
  • Smart Template tile的绘制原理

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    Jerry Wang
  • 关于聚合和多线程的处理套路

    无差别地请求多个外部接口并聚合所有请求结果,应该有属于它自己的套路,应该将所有多线程的操作屏蔽之,我们只关心参数和结果。因此,应该抛弃Callable/Futu...

    用户3579639

扫码关注云+社区

领取腾讯云代金券