定时任务异常:无Slave节点同步,Redis锁处理Kafka事件问题求助
问题分析与解决方案:Redis锁同步异常(无Slave节点完成同步)
场景背景
通过Redis为Kafka事件添加分布式锁,避免同一事件被多个Pod重复处理,执行定时任务时触发异常。
错误信息
定时任务发生意外错误,无Slave节点完成同步 - Java/Spring/Redis
异常栈追踪
java.lang.IllegalStateException: 无Slave节点完成同步 at org.redisson.RedissonBaseLock.lambda$evalWriteAsync$0(RedissonBaseLock.java:225) at java.util.concurrent.CompletableFuture.uniHandle(Unknown Source) at java.util.concurrent.CompletableFuture$UniHandle.tryFire(Unknown Source) at java.util.concurrent.CompletableFuture.postComplete(Unknown Source) at java.util.concurrent.CompletableFuture.complete(Unknown Source) at org.redisson.command.CommandBatchService.lambda$executeAsync$7(CommandBatchService.java:322) at java.util.concurrent.CompletableFuture.uniWhenComplete(Unknown Source) at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(Unknown Source) at java.util.concurrent.CompletableFuture.postComplete(Unknown Source) at java.util.concurrent.CompletableFuture.complete(Unknown Source) at org.redisson.command.RedisCommonBatchExecutor.handleResult(RedisCommonBatchExecutor.java:163) at org.redisson.command.RedisExecutor.checkAttemptPromise(RedisExecutor.java:524) at org.redisson.command.RedisExecutor.lambda$execute$4(RedisExecutor.java:176) at java.util.concurrent.CompletableFuture.uniWhenComplete(Unknown Source) at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(Unknown Source) at java.util.concurrent.CompletableFuture.postComplete(Unknown Source) at java.util.concurrent.CompletableFuture.complete(Unknown Source) at org.redisson.client.handler.CommandDecoder.decodeCommandBatch(CommandDecoder.java:318) at org.redisson.client.handler.CommandDecoder.decodeCommand(CommandDecoder.java:210) at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:137) at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:113) at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:510) at io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:366) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:279) at io.netty.channel.Abstract...
可能的原因及解决办法
1. Redis集群Slave节点状态异常
- 原因:Redisson默认要求写操作同步到指定数量的Slave节点才返回成功,若Slave节点离线、同步延迟或配置错误,会触发该异常。
- 解决:
- 检查Redis集群中Slave节点的运行状态,确认节点在线且正常同步主节点数据。
- 调整Redisson同步策略:在配置中修改
retryAttempts(重试次数)、retryInterval(重试间隔),或设置writeMode为WRITE_MODE_ASYNC(异步写,不等待Slave同步),需权衡数据一致性风险。
2. Redisson锁同步要求过高
- 原因:使用Redisson分布式锁时,默认的同步节点数配置过严,导致Slave未及时同步就触发失败。
- 解决:
- 自定义锁的同步策略,获取锁时指定
syncSlaves参数降低同步节点数量,示例代码:RLock lock = redissonClient.getLock("kafka-event-lock"); lock.lock(30, TimeUnit.SECONDS, 1); // 仅要求同步1个Slave节点 - 若无需强一致性,可通过
RedissonLockConfig设置异步写模式。
- 自定义锁的同步策略,获取锁时指定
3. 网络延迟或分区问题
- 原因:Redis主从节点间网络不稳定,导致同步超时。
- 解决:
- 排查主从节点间的网络连通性,消除网络瓶颈或分区。
- 增加Redisson命令超时时间配置:调整
commandTimeout(默认3000ms),延长等待Slave同步的时间。
内容的提问来源于stack exchange,提问作者DEEP GAHLOT
相关产品推荐
相关产品推荐

