• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
PowerCoder
博客园    首页    新随笔    联系   管理    订阅  订阅

分布式锁总结归纳

我们都知道在微服务架构中,微服务之间要保持单线程运行一段代码只能用到分布式锁,下面这个文章介绍了几种实现分布式锁的方案,并对比了每种方案的优势和劣势:

分布式锁(5种)

需要注意的是,这篇文章中提到了公平锁的概念,在上面这个文章的方案中zookeeper和etcd这两个是天然的公平锁方案,目前来看是值得推荐和考虑的。如果一个分布式锁不是公平锁,会导致先申请锁的线程,可能后获取到锁,例如下面的例子:

  1. 线程A获取到锁,开始执行单线程业务代码。
  2. 线程B申请获取锁,由于线程A获取到了锁,所以线程B一直进入一个循环,直到获取到锁。
  3. 线程C申请获取锁(线程C晚于线程B),由于线程A获取到了锁,所以线程C也一直进入一个循环,直到获取到锁。
  4. 线程A执行完业务代码,释放锁。
  5. 由于没有一个机制来判定线程B和线程C,谁先该获取到锁,所以有可能线程C比线程B先抢到了锁,线程C开始执行单线程业务代码,线程B继续循环,直到获取到锁。

从上面这个过程可以看到明明线程B先于线程C申请获取锁,但是线程C却比线程B先获取到锁,这就是因为没有一个机制(队列)来判定线程B和线程C谁先申请的锁。这样在高并发量申请锁的情况下,可能会有个别线程会一直获取不到锁,一直等待。

对于公平锁的问题,在Java中可以使用Redis结合Redisson来实现分布式公平锁:Redisson分布式锁之公平锁原理

然而在C#中要实现分布式公平锁:

  • 目前要么只有用数据库锁,依赖数据库事务排队来实现公平锁。
  • 要么使用C#结合zookeeper来实现分布式公平锁:Zookeeper基础教程(五):C#实现Zookeeper分布式锁。
  • 使用DistributedLock结合zookeeper来实现分布式公平锁,详情参见GitHub文档。
  • 如果后续有更好的方案再补充。

 

posted @ 2023-10-26 01:55  PowerCoder  阅读(106)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3