Redis 发布订阅与流是两样工具
Redis 发布订阅与流解决的是不同的投递问题。发布订阅面向当前生效的订阅广播,不保留供以后回放的消息;流保存条目,读者可以在它们仍被保留时重新访问。选择哪种机制,首先要回答谁必须收到事件,以及消费者缺席期间应该发生什么。 发布订阅只向生效订阅广播实时事件;独立 XREAD 读者各自回放保留历史,同组成员分担新投递。精确 MAXLEN 2 删除最旧条目。图示来自原有实验,不是新服务运行结果。 先确定每个事件交给谁 对于后续状态可以替代的实时看板更新,只向在线用户广播也许已经足够。但在假设新听众已经到场之前,应等待订阅确认。重连恢复的是未来投递,不是错过的发布。PUBLISH 返回正数,表示按 Redis 命令语义统计到了接收者,不等于应用确认业务处理已经完成。 流有两种不同的消费方式。普通 XREAD 让独立读者分别指定自己的起始 ID,双方可以收到同一份保留历史。它既不自动分担工作,也不替每个连接保管检查点。同一个消费组中的 XREADGROUP 则在具名消费者之间分配新投递,并在未启用 NOACK 时记录待处理条目。 不同消费组允许账单、分析等独立工作流在同一条流上分别推进。组内增加成员是在分担工作,新建一组则是增加一套投递历史。消费者名字不同、工作进程变多,都不承诺负载均分或业务按序完成。应先确定需要的是广播、独立回放还是竞争处理,再选择对应的读取命令,不能把三种模式混为一谈。 保留窗口不是持久化设置 XADD 把数据保存在 Redis 里,并不自动保证每个已接受的写入都能熬过崩溃或故障切换。RDB/AOF 设置、复制行为、键淘汰及恢复操作共同决定持久性。发布订阅也不会因为启用了持久化,就突然拥有可回放的日志。因此,把两者概括成时效性与持久性的取舍,会掩盖各自的真实契约。 MAXLEN 删除的是最旧的条目,不是裁掉最新队尾、同时让早期历史一直保留。近似裁剪可能留下额外记录,精确裁剪则遵循指定数量;两者都不提供无限回放。默认裁剪还可能删除待处理引用对应的载荷,因此应围绕允许的最长停机时间与恢复后的追赶过程设计保留策略和容量。 ...