“CPU飙到90%,内存占用80%”
手机屏幕的蓝光在黑暗里格外刺眼。我揉了揉眼睛,盯着监控图表——明明加了分布式锁限制60秒一次,为什么短短10秒内连续执行了3次任务?
我又仔细对了一遍代码,系统原本有一个非常耗时耗内存、但是低频的操作,为了防止影响系统性能三年前的前辈加了分布式锁,限制每个用户一分钟只能请求一次,简化后的代码如下:
// Redisson分布式锁,60秒只能执行一次
RLock lock = redissonClient.getLock("MY_LOCK:" + request.getUserId());
if (lock.tryLock(0, 60, SECONDS)) {
try {
doTask(); // 执行耗时耗内存的任务
} finally {
// 不释放锁,60秒后自动过期!
}
}
逻辑看似完美,但现实却狠狠打脸。我翻身下床,打开电脑,一场与“幽灵锁”的战争就此开始……
第一回合:锁Key不唯一?
第一回合:锁Key不唯一?怀疑点
-
• 锁Key是否动态变化?
-
• Redis是否异常?
排查
查询日志,发现 request.getUserId()
是相同的,也就是说锁Key是一样的,非动态变化。在20秒内一共请求了26次,这手速...不是,大半夜运营小姐姐还在加班?杯