最近接到一个新需求,前后端保持状态连接,实现动态刷新的效果。那第一个想到的就是websocket,但是websocket我们知道有一个缺陷就是兼容性比较差(如下图红色表示不兼容的浏览器版本),受网络限制比较大。
我们来看看目前使用反向Ajax技术开发事件驱动的两个组件:Socket.IO;Atmosphere
Socket.IO
socket.io将websocket、ajax和其它的通信方式全部封装成了统一的通信接口,解决了浏览器的兼容性问题,底层会自动选用最佳的通信方式;
socket.io支持两种transport,分别是polling和websocket,两种实际的请求协议不一样,polling使用http请求,websocket使用ws,目前socket.io版本在20220下半年已经出了4.x版本,从3.x版本后出的特性更像是为了解决node.js作为服务端处理不好并发的缺陷做的,目前Java端使用最新netty-socket.io 1.7.22版本也无法支持客户端3.x及更高版本,但是由于Java对于并发有很好的处理机制,所以并不是很需要高版本的socket.io客户端特性;如果实在需要对接3.x版本后的socket.io可以尝试使用其官网提供的engine.io包,但是目前并没有很好的实例,或者客户端在请求时把transport改为websocket,这样使用netty-socket.io也可以接收到消息。
Atmosphere
Atmosphere框架是一个Java框架,它兼容了绝大多数的web服务器,也支持任何支持Servlet3.0规范的web服务器。在对于不同的web服务器它提供了一个通用的API,针对于客户端的js与服务器端的servlet,atmosphere为服务端提供了一种通用的通信信道,开发人员可以自由扩展,但其本身并没有用到任何客户端与服务端之间的协议。atmosphere官网提供了js的api,但是已经不再维护了。atmosphere没有提供像socket.io官网那种可视化文档,用的话只能去看他源码里提供的sample,atmosphere-extension包里提供了对socket.io的支持,但是更新停留在七年前,也就是说它所支持socket.io客户端的版本只有0.x版本。atmosphere官网也给了基于netty做的nettosphere组件,从性能上看确实是完爆atmosphere原生。
选择
socket.io和atmosphere选哪个更好呢,其实也是看业务的需要;两个都可以解决websocket版本不兼容的问题。从性能上选择socket.io会更好,netty-socket.io提供的多路复用很好的解决了客户端连接数过多的问题,其吞吐量比atmosphere高许多,所带来的namespace高级特性更完美切合类似聊天室的实现。atmosphere更倾向于Java后台服务的衍生,以及extension包中提供的一堆高级功能,和它非常好的兼容性。
Jmeter测试
用1000个线程同时请求连接
socket.io transport:websocket
↓
socket.io transport:polling
↓
nettosphere
↓
atmosphere
↓