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

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

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的方案:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-session-data-redis</artifactId>
</dependency>

05 小结

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

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

相关推荐
我的xiaodoujiao39 分钟前
Django 权限系统项目实战详细图文教程 3--系统登录功能实现
后端·python·django
可乐_不渴41 分钟前
【Linux】 进程虚拟地址空间
java·linux·javascript
老王IT43 分钟前
Rust开发环境搭建教程
开发语言·后端·rust
武子康1 小时前
HunyuanVideo-1.5 跑得更快,先减步数还是开缓存?
人工智能·后端·agent
chenbingjie_c1 小时前
C++ 模板进阶:从 “会用“ 到 “懂底层“(非类型参数・特化・分离式编译)
c++·后端
vipxieliang1 小时前
ValidX vs 正则表达式:可读性与维护性对比
java·spring boot
yunyi1 小时前
给桌面客户端做下载加速:从「桶直接公开」到「边缘优先、源站兜底」的三代演进
前端·后端
337801 小时前
5分钟搞懂登录认证和授权框架Spring Security
java·spring boot
vipxieliang1 小时前
Spring Security 6.x 实战:认证、授权与 JWT 集成
java·spring boot