HTML5有了websocket,让我们可以方便开发实时通信程序,但websocket还很年轻,目前还是需要一个更加成熟的实时通讯方案

SockJS 就是一个非常好的选择,SockJS已经为很多实时web框架提供了底层服务

SockJS 是一个JavaScript库,提供了一个类似WebSocket的对象,用来创建低延时、全双工、跨域通讯服务,拥有一致的、跨浏览器的API,SockJS集成了WebSocket和其他通信方式,形成一套稳定的实时通讯服务方案

SockJS的特点


浏览器端和服务器端的API都非常简洁,尽可能的靠近WebSocket API

有很强的扩展能力,支持负载均衡

全面支持跨域通信

支持丰富的传输方式,在某种方式受阻的情况下,智能切换其他方式

建立连接非常快

不使用Flash,纯Javascript

服务器端的代码简单,方便使用不同语言开发服务端代码

SockJS的核心


SockJS提供了WebSocket一样的实时通信功能,看似比较简单,但他最牛的地方在于兼容性,能够在各种环境下提供服务

因为在真实场景中,网络环境非常复杂

首先,浏览器对WebSocket的兼容还不够完备

并且,浏览器和server之间可能会有很多中间节点,如路由器、代理服务器、负载均衡器……,这些中间节点可能会阻止WebSocket的连接

SockJS的核心是具有健壮的传输协议

不仅提供了原生WebSocket协议的支持,还提供了流传输Streaming和轮询Polling

其中又包括多种底层传输方案,如:

xhr、xhr_streaming、jsonp、eventsource、htmlfile

如果客户端采用websocket连接不上服务器,它可以回退选择其他传输方案,确保总是可以利用一种传输协议,连接到服务器

负载均衡


单个SockJS server的能力总是有限的,SockJS也提供了扩展思路

最简单的就是使用多域名

例如 sockjs1.example.com 和 sockjs2.example.com,让客户端进行随机选择

也可以使用支持WebSocket的负载均衡器,如 HAProxy

对于不支持WebSocket的负载均衡器,建议在客户端和服务器端都禁用掉WebSocket,这样可以缩短通信建立的时间

这种情况需要负载均衡器配置为sticky sessions 方式,让相同SockJS session的请求都转到同一个SockJS server

SockJS资源


client端实现:sockjs-client

server端的实现有很多,如 node、erlang、python、java ……

项目地址

https://github.com/sockjs/sockjs-client