有个项目小伙伴,为了防止当前跑批未跑完,下次跑批又开始跑,就写了个锁,作为防重机制,
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容器(服务)节点进行压测