From fdc888af26de4a07a555b9a2c1133ce36c491aa9 Mon Sep 17 00:00:00 2001 From: guide Date: Thu, 1 Sep 2022 11:29:56 +0800 Subject: [PATCH] =?UTF-8?q?[docs=20update]=E5=AE=8C=E5=96=84=E5=AF=B9?= =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8F=E9=94=81=E7=9A=84=E8=A7=A3=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + docs/distributed-system/distributed-lock.md | 23 ++++++++++++++++-- .../distributed-lock/distributed-lock.png | Bin 0 -> 17934 bytes .../distributed-lock/jvm-local-lock.png | Bin 0 -> 13499 bytes 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 docs/distributed-system/images/distributed-lock/distributed-lock.png create mode 100644 docs/distributed-system/images/distributed-lock/jvm-local-lock.png diff --git a/.gitignore b/.gitignore index 49a42094..aa4674bb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ /node_modules /package-lock.json +\*.drawio .DS_Store # VS Code Config file .vscode/ diff --git a/docs/distributed-system/distributed-lock.md b/docs/distributed-system/distributed-lock.md index 041a5173..28723a5f 100644 --- a/docs/distributed-system/distributed-lock.md +++ b/docs/distributed-system/distributed-lock.md @@ -1,13 +1,31 @@ --- title: 分布式锁 category: 分布式 + + --- 网上有很多分布式锁相关的文章,写了一个相对简洁易懂的版本,针对面试和工作应该够用了。 ## 什么是分布式锁? -对于单机多线程,在 Java 中,我们通常使用 `ReetrantLock` 这类 JDK 自带的 **本地锁** 来控制本地多个线程对本地共享资源的访问。对于分布式系统,我们通常使用 **分布式锁** 来控制多个服务对共享资源的访问。 +对于单机多线程来说,在 Java 中,我们通常使用 `ReetrantLock` 类、`synchronized` 关键字这类 JDK 自带的 **本地锁** 来控制一个 JVM 进程内的多个线程对本地共享资源的访问。 + +下面是我对本地锁画的一张示意图。 + +![本地锁](./images/distributed-lock/jvm-local-lock.png) + +从图中可以看出,这些线程访问共享资源是互斥的,同一时刻只有一个线程可以获取到本地锁访问共享资源。 + +分布式系统下,不同的服务/客户端通常运行在独立的 JVM 进程上。如果多个 JVM 进程共享同一份资源的话,使用本地锁就没办法实现资源的互斥访问了。于是,**分布式锁** 就诞生了。 + +举个例子:系统的订单服务一共部署了 3 份,都对外提供服务。用户下订单之前需要检查库存,为了防止超卖,这里需要加锁以实现对检查库存操作的同步访问。由于订单服务位于不同的 JVM 进程中,本地锁在这种情况下就没办法正常工作了。我们需要用到分布式锁,这样的话,即使多个线程不在同一个 JVM 进程中也能获取到同一把锁,进而实现共享资源的互斥访问。 + +下面是我对分布式锁画的一张示意图。 + +![分布式锁](./images/distributed-lock/distributed-lock.png) + +从图中可以看出,这些独立的进程中的线程访问共享资源是互斥的,同一时刻只有一个线程可以获取到分布式锁访问共享资源。 一个最基本的分布式锁需要满足: @@ -112,8 +130,9 @@ Redlock 算法的思想是让客户端向 Redis 集群中的多个独立的 Redi Redlock 是直接操作 Redis 节点的,并不是通过 Redis 集群操作的,这样才可以避免 Redis 集群主从切换导致的锁丢失问题。 -Redlock 实现比较复杂,性能比较差,发生时钟变迁的情况下还存在安全性隐患。《数据密集型应用系统设计》一书的作者 Martin Kleppmann 曾经专门发文怼过 Redlock,他认为这是一个很差的分布式锁实现。感兴趣的朋友可以看看[Redis 锁从面试连环炮聊到神仙打架](https://mp.weixin.qq.com/s?__biz=Mzg3NjU3NTkwMQ==&mid=2247505097&idx=1&sn=5c03cb769c4458350f4d4a321ad51f5a&source=41#wechat_redirect)这篇文章,有详细介绍到 antirez 和 Martin Kleppmann 关于 Redlock 的激烈辩论。 +Redlock 实现比较复杂,性能比较差,发生时钟变迁的情况下还存在安全性隐患。《数据密集型应用系统设计》一书的作者 Martin Kleppmann 曾经专门发文([How to do distributed locking - Martin Kleppmann - 2016](https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html))怼过 Redlock,他认为这是一个很差的分布式锁实现。感兴趣的朋友可以看看[Redis 锁从面试连环炮聊到神仙打架](https://mp.weixin.qq.com/s?__biz=Mzg3NjU3NTkwMQ==&mid=2247505097&idx=1&sn=5c03cb769c4458350f4d4a321ad51f5a&source=41#wechat_redirect)这篇文章,有详细介绍到 antirez 和 Martin Kleppmann 关于 Redlock 的激烈辩论。 实际项目中不建议使用 Redlock 算法,成本和收益不成正比。 如果不是非要实现绝对可靠的分布式锁的话,其实单机版 Redis 就完全够了,实现简单,性能也非常高。如果你必须要实现一个绝对可靠的分布式锁的话,可以基于 Zookeeper 来做,只是性能会差一些。 + diff --git a/docs/distributed-system/images/distributed-lock/distributed-lock.png b/docs/distributed-system/images/distributed-lock/distributed-lock.png new file mode 100644 index 0000000000000000000000000000000000000000..0908f6573b2dd74c46b0ae8b917f56a7f4a1dd05 GIT binary patch literal 17934 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 literal 0 HcmV?d00001