号外号外,Stream-Nexus推送项目支持集群部署了

0 阅读2分钟

关注我的公众号:【编程朝花夕拾】,可获取首发内容。

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设计

总体的设计

推送的设计

总结下来很简单:

  1. 建立连接本地保存,Redis保存映射。
  2. 推送消息通过调用Redis发布/订阅,根据Redis定位具体节点,处理消息。
  3. 心跳推送消息。

3.2 WebSocket的设计

总体设计

推送的设计

3.3 区别

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

简单来说,SSE的那每次心会负载均衡到哪个节点都是不知道的,只能通过Redis的总线分发才能定位到具体的节点。而WebSocket双向通道,建立连接之后,始终保持连接心跳也到指定的节点上,无需Redis总线查找。

04 admin后台

既然涉及到集群部署,那就面临多节点的登录问题。单机模式下,放在Session中可。而在集群模式下就要考虑Session共享的问题。

集群是模式下,选择Spring Seesion Redis的方案:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-session-data-redis</artifactId>
</dependency>

05 小结

原本只想做单机模式就够了,但是有不少老铁反馈希望能支持集群。看看该项目是有老铁想要使用的,于是就升级了。需要的老铁可以去下载了。

在使用过程中,集群模式下要注意Redis的协议类型,默认resp3,如果使用Redis5.0以下伙伴需要修改协议为resp2。希望帮助到大家。