经常使用的Websocket技术一览

1. 前言

WebsocketHTML5 开始提供的一种在单个 TCP 链接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,容许服务端主动向客户端推送数据,固然也支持客户端发送数据到服务端。一般用来社交聊天、弹幕、多玩家游戏、协同编辑、股票基金实时报价、资讯自动更新等场景,那么今天就简单聊一下在Java开发中对Websocket的技术选型。java

技术选型是结合自身业务选择最适合的技术方案,并不存在褒贬。

2. 经常使用的Websocket技术

2.1 Java Websocket规范

这是JavaEE提供的规范,在包javax.websocket下,包含客户端API和服务端API,服务端API彻底依赖于客户端API,只是在其基础上添加了一些功能,因此只须要导入服务端依赖便可。 具体实现须要Web容器、JavaEE服务器或者框架提供。咱们经常使用的Web容器TomcatUndertow等都支持。web

优势:集成起来简单,原生的Java支持。跨域

缺点:和Web服务器等共享容器耦合度高,广播、组播须要自行控制。并发量较低,调优麻烦,存在兼容性问题。浏览器

2.2 SockJS

SockJS是一个浏览器JavaScript库,对Websocket进行了抽象。SockJS为您提供了一个一致的,跨浏览器的Javascript API,该API在浏览器和Web服务器之间建立了低延迟,全双工,跨域的通讯通道。SockJS尝试首先使用本机WebSockets。若是失败了,它将尝试其它各类特定于浏览器的传输协议,例如xhr-streamingServer sent events 以及长轮询等。一般也会配合STOMP(面向消息的简单文本协议)来简化其使用。其实Spring Websocket组件中采用的就是此协议。服务器

优势:社区活跃,技术成熟,协议栈丰富,有全套Spring解决方案,兼容性强,另外能够结合发布订阅模式。websocket

缺点:须要对SockJS和STOMP进行学习,断线重连、心跳检测、二进制支持很差。并发

2.3 Socket.IO

Socket.IO 是一个基于 Node.js 的实时应用程序框架,在即时通信、通知与消息推送,实时分析等场景中有较为普遍的应用,可是它提供基于Netty的服务端实现以及客户端实现,同时支持Websocket和长轮询。除了Websocket的经常使用场景外,咱们能够经过该组件实现安卓和IOS的消息推送。框架

优势:性能良好,支持广播、组播,断线重连、心跳检测、二进制。支持安卓和IOS平台。社区活跃。socket

缺点:须要自行封装同Spring的集成,服务端并不是社区维护,资源消耗大。性能

2.4 ReactiveStream

一些反应流规范和框架也对Websocket进行了实现。Spring WebfluxRSocket就是其中的表明,目前官方已经放出了一些相关的DEMO。

优势:高吞吐量、高性能。

缺点:技术比较新、学习资料少。

3. 总结

若是业务量很是少并且很是急迫的话第一种能够尝试一下。SockJSSocket.IO的争论点在于性能上后者要好一些,固然资源也消耗大,对移动端的推送功能支持更好一些。在Spring整合上以及全套解决方案上SockJS更具优点。若是追求高性能、高吞吐量的Websocket那么无疑反应式更加合适,可是学习成本也相对较高。其它小众的技术这里不作评测,若是你有比较好的方案可留言讨论。

附:性能基准测试

如下是国外某论文在2020年对原生WebsocketSockJSSocket.IO进行的性能测试的一些关键指标。

随着客户端的增多建立链接的耗时

随着客户端链接增多接收消息的平均时间

接收一条消息所消耗的链接数和重组的TCP分段数

服务端内存占用趋势

英文完整版评测报告可经过公众号 码农小胖哥 回复 ws获取。

关注公众号:Felordcn 获取更多资讯

我的博客:https://felord.cn

相关文章
相关标签/搜索