关注我的公众号:【编程朝花夕拾】,可获取首发内容。
01 引言
Stream-Nexus是之前整理的一个开源项目,轻量级的实时推送平台,支持SSE和WebSocket。先前发的版本仅支持单机部署,但是有老铁提出要能支持集群部署,这两天有空完善了一下项目,支持集群部署。
02 核心
之前介绍过SSE和WebSocket的客户端不能直接扔到Redis中,所以需要将客户端的映射信息保存在Redis,真正的推送由各个节点的客户端实际推送。
大致流程如下:

集群总线采用的常见的中间件:Redis。使用Redis的Pub/Sub即发布订阅功能,因为考虑的的瞬时通知,所以对于消息的丢失不敏感。如果要考虑消息的持久化就需要使用Redis5.0新增的Streams数据结构了。
中间件选好了,接下来的核心主要有两个:
Redis如何保存客户端连接映射admin控制台等登录问题

GitHub地址:github.com/simonking-w...
03 客户端连接保存
原本想着SSE和WebSocket保存客户端的连接一样即可,在开发过程中才发现这两种方式完全没必要保持一致,各有各的特性。
3.1 SSE设计
总体的设计

推送的设计

总结下来很简单:
- 建立连接本地保存,
Redis保存映射。 - 推送消息通过调用
Redis发布/订阅,根据Redis定位具体节点,处理消息。 - 心跳推送消息。
3.2 WebSocket的设计
总体设计

推送的设计

3.3 区别
SSE和WebSocket最大的区别就是SSE的单项的,而WebSocket是双向的。心跳设计区别的关键。

简单来说,SSE的那每次心会负载均衡到哪个节点都是不知道的,只能通过Redis的总线分发才能定位到具体的节点。而WebSocket双向通道,建立连接之后,始终保持连接心跳也到指定的节点上,无需Redis总线查找。
04 admin后台
既然涉及到集群部署,那就面临多节点的登录问题。单机模式下,放在Session中可。而在集群模式下就要考虑Session共享的问题。
集群是模式下,选择Spring Seesion Redis的方案:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-session-data-redis</artifactId>
</dependency>
05 小结
原本只想做单机模式就够了,但是有不少老铁反馈希望能支持集群。看看该项目是有老铁想要使用的,于是就升级了。需要的老铁可以去下载了。
在使用过程中,集群模式下要注意Redis的协议类型,默认resp3,如果使用Redis5.0以下伙伴需要修改协议为resp2。希望帮助到大家。