在上一篇中,我们介绍了为什么要引入WebSocket,这一篇我们介绍WebSocket实现过程中有哪些约束。
WebSocket实现可伸缩性更难
WebSocket的好处是实时性,但牺牲了可伸缩性。
在HTTP通信的系统中,我们通过负载均衡很容易做伸缩,如下图所示
但是在WebSocket通信的系统中,因为客户端与负载均衡服务器只建立了一个WebSocket连接,此时如果要做可伸缩性,需要比较复杂的架构设计,如下图所示:
将WebSocket分层,第一层是WebSocket接入层,第二层是WebSocket实现层。在WebSocket接入层只做协议转换,转换为消息分发系统(如Kafka)能识别的协议。
WebSocket长连接的心跳保持比较复杂
HTTP长连接只能基于简单的超时,比如65秒。而WebSocket长连接需要基于Ping/Pong心跳机制来维持。
WebSocket对开发者要求高了许多
对前端开发者,往往要具备数据驱动使用javascript的能力,且需要维持住ws连接(否则消息无法推送);
对后端开发者而言,难度增大了很多:
- 一是长连接需要后端处理业务的代码更稳定(不要随便把进程和框架都crash掉)
- 二是推送消息相对复杂一些
- 三是成熟的http生态下有大量的组件可以复用,websocket则太新了一点。