zoukankan      html  css  js  c++  java
  • 13.分布式锁在不同环境引发的坑

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

    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容器(服务)节点进行压测

  • 相关阅读:
    web应用本质
    SQL逻辑查询语句执行顺序
    flask-WTForms组件
    生产者消费者模型
    单例模式
    flask中的信号量
    flask-script
    flask-session
    在python项目中导出项目依赖的模块信息
    Flask简介之简单应用
  • 原文地址:https://www.cnblogs.com/flgb/p/13929188.html
Copyright © 2011-2022 走看看