13.分布式锁在不同环境引发的坑

Posted on 2020-11-04 22:42  FLGB  阅读(240)  评论(0编辑  收藏  举报

有个项目小伙伴,为了防止当前跑批未跑完,下次跑批又开始跑,就写了个锁,作为防重机制,

redisCluster.setnx(key,value)== 0 来判断  (其中value是uuid+时间戳)
 SETNX key value    # job 设置成功 返回1
(integer) 1

redis> SETNX key value   # 已经存在 ,失败 返回0
(integer) 0

迷惑性的一点是,setnx(key,value),小伙伴以为setnx命令是key,value两个值一起设置,每次value不一样这样就可以防重。

最关键的是:uat环境是quartz单节点,调度防重完全没问题,测试一切ok

结果pat上quartz是多节点,出现了防重失败,导致同时一批数据多个批一起执行,造成交易重复

 

本质原因:对分布式锁原理不清楚,setnx返回0,证明键存在,此时需要取出值进行对比

或者使用第三方包提供的分布式锁,比如lettuce、curator

客观原因:uat、pat环境不一致导致,如何避免,可以进行uat压测,压测前申请扩充对应pat容器(服务)节点进行压测

Copyright © 2024 FLGB
Powered by .NET 8.0 on Kubernetes