WebSocket:Web上的实时通信
WebSocket:Web上的实时通信
传统的Web基于请求-响应模型:浏览器请求某些内容,服务器做出响应。但如果服务器需要在未被请求的情况下向浏览器发送数据呢?这就是WebSocket的用武之地。它们在浏览器和服务器之间提供持久的双向连接,实现实时通信。
WebSocket的不同之处
使用常规HTTP时,浏览器必须不断询问服务器是否有新数据——这种技术称为轮询。这是低效的,因为大多数轮询不会返回任何内容,浪费了带宽和服务器资源。WebSocket颠覆了这种模式:连接保持打开状态,任何一方都可以随时发送数据。服务器可以立即推送更新,而无需等待客户端请求。
WebSocket连接以常规HTTP请求开始,然后升级到WebSocket协议。升级后,连接保持打开状态,直到一方关闭它。数据可以同时双向流动,每条消息的开销非常低——只有几个字节的帧。
常见用例
WebSocket非常适合任何需要实时更新的应用程序。聊天应用程序使用它们即时传递消息。实时仪表盘在股票价格、服务器指标或体育比分变化时进行更新。像Google Docs这样的协作编辑工具使用WebSocket在多个用户之间同步更改。多人游戏使用它们进行实时游戏状态更新。
使用WebSocket构建
在客户端,WebSocket API内置于现代浏览器中。您使用URL创建一个WebSocket对象,并监听open、message和close等事件。发送数据就像调用socket.send()一样简单。在服务器端,大多数框架都内置了WebSocket支持或作为附加组件提供。
对于更复杂的应用程序,像Socket.IO这样的库在原始WebSocket之上添加了有用的功能:如果连接断开则自动重新连接,如果WebSocket不可用则回退到HTTP长轮询,以及房间和命名空间等更高级别的抽象。
扩展WebSocket
WebSocket为每个用户保持一个打开的连接,这意味着它们比常规HTTP请求使用更多的服务器内存。当您有数千或数百万个并发连接时,您需要考虑扩展。一种常见的方法是使用像Redis这样的发布/订阅系统在多个服务器实例之间广播消息。负载均衡器需要支持粘性会话或WebSocket升级协议。
像服务器发送事件(SSE)这样的替代方法对于从服务器到客户端的单向通信更简单。而对于非常高的吞吐量场景,WebRTC数据通道可能更高效。
