使用cgo实现高性能WebSocket服务

Go 语言的便捷,协程的高效,GC以及自身的安全性,使得它成为后端业务开发的利器. 之前看过来自 Mail.Ru 工程师分享 Go的百万连接数的WebSocket服务优化 ,*中文翻译版.描述通过使用优化 Go 协程和零拷贝Http Header 实现了对内存的高效利用. 但其中自定义的 epoll 结构中依旧用了锁,个人觉得还是有优化的空间. 可以用高效的 uWebSockets 库配合,使得接入层用高效的 C++ 语言,而后端业务处理则用 Go 语言.这样的好处就是 C++ 可以最高效精准的把控接入层的逻辑处理和内存的使用,而后端的业务开发则是以高效安全为主,使用 Go 正好合适. 这里使用的 uWebSockets 为 0.14.8 tag 的版本,配合 libuv作为事件驱动,zlib 作为压缩算法库,openssl 作为加密库,四个编译为 .a类型的静态库,方便一同编译到程序中,避免运行时动态库缺失的问题. … “使用cgo实现高性能WebSocket服务”

Read More

用TypeScript实现对WebSocket的封装-Part-2

在驱动接口声明完成后,实现功能部分会比较繁复,需要考虑保活/断线重连/消息丢失重发/消息去重,等大部分弱网络下的问题,这是为了方便上层的调用,上层无需关心底层驱动的实现. 实现`chat-ws.ts`: “`typescript ///<reference path="./chat-ws.d.ts" /> import { IntervalTimer, ETimerEventType as ETETP } from './chat-timer'; @Injectable export class ChatWSProvider implements IChatWSProvider { construtor(){ //… } private logger: ILogger = null; private remoteAddr: string; private webSocket: … “用TypeScript实现对WebSocket的封装-Part-2”

Read More

用TypeScript实现对WebSocket的封装-Part-1

在 node.js 的第三方 module 中提供了许多优质的 WebSocket 驱动,比如 ws 和 Socket.IO,不过 TypeScript 内置库也已经实现了 WebSocket 驱动.因此可以无需添加第三方 WebSocket 库. 得益于 TypeScript 强大语法的支持,因此代码可以像编译型语言那样先对用到的类型进行声明,然后对接口实现定义. 先前项目前端使用 TypeScript,因此使用了 TypeScript 实现了WebSocket的聊天驱动.这些天来总结了项目关于聊天驱动底层的一些经验与问题,故记录下. 废话不说. 首先定义通知上层的事件回调接口,这些事件通常是收到 ws 数据或 ws 异常后触发的,因此可以按照功能分为: 登录事件回调 : type FnOnLoginCallback,来自登录成功后的事件回调声明 登出事件回调 : … “用TypeScript实现对WebSocket的封装-Part-1”

Read More

深入WebSocket协议

无论是 HTTP 还是 HTTPS协议,它们一出场就已经定死了只能是短连接,而诸如基于 Jquery 或 Ajax 靠定时器轮询的请求来实现长连接的方法却会加大服务端的资源消耗,只能是旁门左道。即便服务端有 HTTP Keepalive 这种连接复用,仍旧无法避免一段空闲时间后就断开连接的尴尬,尤其是中间还有不可预知的网关也可能会关闭这个连接,并且服务端一旦配置不当,TCP长连接在服务端未能及时释放造成资源消耗加剧,就会出现类似雪崩效应。 并且基于短连接,HTTP/HTTPS 协议就产生了一个巨大缺陷,即请回只能由客户端发起,服务端只能做回应,不能做主动推送,因为服务端不知道客户端何时会将连接关闭(TCP是双工的,而各个浏览器的实现也不一样)。 因此就急需一种能够让浏览器支持并兼任HTTP/HTTPS协议的TCP长连接。 时代造就英雄,这种环境下便有了WebSocket。 WebSocket 协议在2008年诞生,由谷歌提出(话说Ajax也是谷歌提出的),是 HTML5 种的一个协议规范,2011 年成为国际互联网标准规范 RFC 6455,跟随着 HTML5 的步伐一同面世,主流浏览器早已全部支持了。 WebSocket 的优点有: 底层基于 TCP 实现的长连接协议,双工的性质使得服务端能主动推送信息 同样可以使用 80 和 443 端口,协议转换通过 HTTP/HTTPS … “深入WebSocket协议”

Read More