V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
javaisthebest
V2EX  ›  程序员

咨询一个关于锁的业务问题

  •  
  •   javaisthebest · 118 天前 · 1614 次点击
    这是一个创建于 118 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在分布式 Web 后端中,各位老哥们会考虑在业务接口中引入锁 信号量这种吗?

    我记得很久以前我在一个博客中看到 能不用 lock 尽量不用 说 一个是不好控制 另外一个是容易吃性能

    各位老哥们能指点下?或者心得?

    9 条回复    2024-07-26 13:48:24 +08:00
    codehz
        1
    codehz  
       118 天前
    用不用不是得看正确性吗,当然除了传统意义上的分布式锁之外也有别的方案,比如乐观并发控制
    sujin190
        2
    sujin190  
       118 天前
    吃不了多少性能吧,而且 web 中分布式锁都是对特定资源加锁,除非是秒杀这种特定场景否则对并发性影响几乎可以忽略不计,而且靠谱一点的分布式锁方案网络正常情况下延时都应该低于 2ms ,这对接口响应时间来说的影响也不大吧,主要就是加锁直观简单且靠谱,你看直接套用系统的多线程编程都很难了,其实用其它方案其实更复杂的,想要设计完备其实就更难了
    mightybruce
        3
    mightybruce  
       118 天前
    没有什么绝对的事情, 建议多看看架构设计的书。
    软件架构设计没有银弹,只有取舍。
    byehair
        4
    byehair  
       118 天前   ❤️ 1
    当你要访问共享资源,又可能会发生并发修改问题的时候,没办法不用锁。如果不会造成并发修改冲突,无锁编程肯定性能高。

    比如使用旁路缓存模式,从数据库加载 1 万条数据列表大概 10MB 到 redis ,这时候并发请求读取,A 线程读取数据库 1 万条,B 线程也来读取发现 Redis 数据不存在也去请求数据库,这时候 B 读取数据库发现有人更新了读取到了 1 万零 1 条,然后 B 线程执行快先完成将数据写入 Redis ,A 线程此时慢了一步继续写入 Redis ,那最新的一条数据就被覆盖了,这时候缓存和数据库就不一致。

    当然也可以用队列来处理这种情形。

    信号量一般用在对资源的数量要求极度精准的情况,比如限流最高就要求同一单位时间 1000 人访问,那使用信号量就会特别精准,而且还能应对流量突刺,同时不会产生临界区问题,你使用其他的限流算法就比较难做到。

    所以,如果你现在还没有使用锁和信号量,那一般是以下三个情况:

    1. 你的业务场景确实暂时不需要,不必强加
    2. 你还没有在线上遇到过由并发读写产生的 bug ,所以还没发现
    3. 因为缺少并发处理经验,所以暂时缺少这部分的意识,需要补充
    liuqiongyu889
        5
    liuqiongyu889  
       118 天前
    看情况,大部分的表单提交请求冲突覆盖都没问题,没必要上锁,客户端做好 button disabled 尽量避免重复发送就行,交易、订单、等需要严格递增插入的场景必须上锁,避免脏状态落库,java 可以考虑用这个:[redisson]( https://github.com/redisson/redisson),大部分需求都能满足了。
    awalkingman
        6
    awalkingman  
       118 天前
    @codehz 同意。用不用是看需要看需求,掌握好技能根据实际情况决定,不是看博客下爆论。
    potatowish
        7
    potatowish  
       118 天前 via iPhone
    分布式锁、分布式读写锁、乐观锁这三个用的多。没获取到锁或者条件不满足,让调用方自己重试
    Pantheoon
        8
    Pantheoon  
       118 天前
    搞 web 看下分布式锁的原理 以及 mysql 锁的原理,jdk 自带的锁都是单机的,用的很少
    piecezzz
        9
    piecezzz  
       118 天前
    看场景,看业务。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3051 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:55 · PVG 20:55 · LAX 04:55 · JFK 07:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.