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 概述

WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。

1464
来自专栏技术记录

websocket教程(一) 非常有趣的理解websocket

一、websocket与http WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连...

2135
来自专栏Java3y

AJAX跨域完全讲解

AJAX跨域完全讲解 今天在慕课网上学习了AJAX跨域完全讲解:https://www.imooc.com/learn/947 我在收集AJAX面试题的时候其实...

2677
来自专栏Coding01

结合 Laravel 初步学习 GraphQL

因为 Laravel 5.5 开始,有「包自动发现」http://mp.weixin.qq.com/s/AD05BiKjPsI2ehC-mhQJQw功能,所以 ...

661
来自专栏程序你好

SignalR介绍简单示例教程入门版

854
来自专栏互联网杂技

使用 HTML5 WebSocket 构建实时 Web 应用

作为下一代的 Web 标准,HTML5 拥有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、WebSocket 等等。这其中有“Web 的 T...

5586
来自专栏大魏分享(微信公众号:david-share)

终于搞明白了EJB!| 从开发角度看应用架构3:部署一个无状态的session bean

2133
来自专栏Golang语言社区

WebSocket 是什么原理?为什么可以实现持久连接?--装

一、WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HT...

3217
来自专栏冰霜之地

全双工通信的 WebSocket

WebSocket 是一种网络通信协议。在 2009 年诞生,于 2011 年被 IETF 定为标准 RFC 6455 通信标准。并由 RFC7936 补充规...

1371
来自专栏程序员与猫

常见的Web实时消息交互方式和SignalR

标签: WebSocket SignalR 前言 最近因为项目中涉及到了实时数据的传输,特地去了解了一下当前Web应用中常见的实时交互手段,当然一开始也不仅限于...

3175

扫码关注云+社区