关于Quarkus Redis Client扩展无法接收全部过期键事件消息的求助
嘿,我来帮你拆解下这个问题的核心原因和可行的解决方案~
首先先明确一个关键细节:Redis集群中的过期键事件是在键所在的节点本地触发的,而且Redis的pub/sub机制本身没有集群级别的事件广播能力——也就是说,你当前只连接集群中的某一个节点(大概率是客户端自动选择的入口节点)订阅,自然只能收到这个节点上产生的过期事件,其他5个节点的事件完全收不到,这应该是你漏收事件的核心原因。
下面是具体的建议和排查方向:
必须针对每个集群节点单独订阅
你需要遍历Redis集群的所有6个节点,为每个节点创建独立的ReactivePubSubCommands实例并执行订阅逻辑。因为每个节点的过期事件只会在本地发布,不会同步到集群其他节点,所以单节点订阅必然会漏消息。处理集群节点的动态变化
在K8s(不管是GKE还是Openshift)环境下,Redis集群可能会有节点扩缩容、故障转移的情况,所以不能硬编码节点列表。建议通过CLUSTER NODES命令定期获取集群的最新节点列表,自动刷新订阅连接——比如每隔一段时间执行一次节点发现,新增节点就创建订阅,下线节点就销毁对应的连接。检查所有Redis节点的配置
确保每个Redis节点都开启了notify-keyspace-events配置,并且包含Ex参数(开启过期事件通知)。你可以登录每个节点执行CONFIG GET notify-keyspace-events命令验证,如果返回值里没有Ex,就需要修改配置并重启节点。优化你的订阅代码逻辑
你当前的代码只处理了单个连接的订阅,需要改成批量管理多节点订阅的模式。比如封装一个通用的订阅方法,接收节点地址作为参数,创建对应的客户端连接、执行订阅、处理该连接的重连逻辑。然后遍历所有节点地址,调用这个方法即可。排查其他可能的丢点原因
- 检查每个节点的订阅连接状态:如果某个节点的订阅连接因为网络波动断开,而你的重连逻辑只针对当前连接,没有监控所有节点的连接,就会漏收该节点的事件;
- 了解Redis过期键清理机制:Redis用惰性删除+定期删除两种方式清理过期键,部分过期事件可能会延迟触发,但不会完全丢失,如果是延迟的话可以观察日志确认。
你的现有订阅逻辑本身是没问题的,只要把它扩展到集群的所有节点上,应该就能解决漏收事件的问题啦~
备注:内容来源于stack exchange,提问作者dharriso

