rRedis 可靠发布/订阅

circle-info

SocketIO4J 使用 Redisson 客户端连接到 Redis 服务器。也可能支持诸如 Valkey 和 DragonflyDB 等兼容 Redis 的替代后端。

RedissonPubSubReliableEventStore 提供了一个分布式、 可重放的 事件存储,用于 socketio4j,使用 由 Redis Streams 支持的 Redis Reliable Topics。 它支持多节点同步,并可选择性地修剪流以控制内存占用,实现跨服务器重启的持久性,同时仍能以近实时方式传递事件。

Redis 可靠发布/订阅在内部使用 Streams 以实现持久性,但不暴露偏移;而 Redis Streams 直接暴露偏移,支持受控重放和连接状态恢复功能(计划开发)。

关键特性

  • 通过 Redis Streams 实现可靠传递 — 保留最近消息以供可控重放

  • 基于流的主题RReliableTopic 确保消息被持久化并传递给迟到的订阅者

  • 可选的自动修剪 — 使用定期的 XTRIM

  • 异步分发 — 交付回调在 Netty 事件循环之外发生

  • 重复防止 — 通过过滤自身产生的事件来避免循环 nodeId

工作原理

  • publish0 将事件写入一个 可靠主题,该主题内部会追加到一个 Redis 流

  • subscribe0 在可靠主题上注册监听器;即使重连后,事件也会从底层流中拉取

  • 流条目会基于以下内容定期修剪 streamMaxLengthtrimEvery

  • 修剪在守护线程中异步执行以避免阻塞 I/O

  • 流元数据(activePubTopics, activeSubTopics, trimTopics)按事件类型进行跟踪

模式

模式
行为
何时使用

MULTI_CHANNEL

按事件类型的流 + 可靠主题

默认;按事件类型隔离流量并保持顺序

SINGLE_CHANNEL

所有事件路由到单个可靠流

当需要严格的全局顺序时

优点

👍 消息持久化在 Redis 流中 — 可在修剪限制内恢复 👍 适用于 具有持久性的多节点同步 👍 可选修剪防止无限制的内存使用 👍 可在重连后重放最近消息(在修剪范围内) 👍 熟悉的 Redis 部署模型,无需 Kafka/NATS

限制

ℹ️ 不完全的恰好一次 — 重启或重连后可能出现重复 ℹ️ 顺序性为按流保证 — 跨事件的顺序需要单通道模式 ℹ️ 需要 Redis Streams 支持(Redis 5+) ℹ️ 可靠性取决于流的保留配置和修剪策略

传递保证: 至少一次语义 — 监听器必须是幂等的以处理可能的重复投递。

最后更新于

这有帮助吗?