Skip to content

Commit b3bd494

Browse files
committed
[docs update]分布式
1 parent 737a9cc commit b3bd494

File tree

12 files changed

+203
-7760
lines changed

12 files changed

+203
-7760
lines changed

JavaGuide.md

Lines changed: 0 additions & 7711 deletions
This file was deleted.

_sidebar.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,16 @@
3434
* [理论&算法&协议](./docs/g-0分布式理论.md)
3535
* [网关](./docs/g-1网关.md)
3636
* [分布式 ID](./docs/g-2分布式id.md)
37-
* RPC
38-
* 分布式事务
39-
* 分布式协调(ZooKeeper)
40-
37+
* [分布式锁](./docs/g-3分布式锁.md)
38+
* [RPC](./docs/g-4rpc.md)
39+
* [分布式事务(付费)](./docs/g-5分布式事务(付费).md)
40+
* [分布式协调(ZooKeeper)](./docs/g-6分布式协调(ZooKeeper).md)
41+
4142
* 高性能
4243

44+
* 分库分表
45+
46+
* 负载均衡
47+
4348
* 高可用
4449

docs/_sidebar.md

Lines changed: 0 additions & 39 deletions
This file was deleted.

docs/b-4jvm.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@
1212
4. [类加载过程详解](https://javaguide.cn/java/jvm/class-loading-process.html)
1313
5. [类加载器详解](https://javaguide.cn/java/jvm/classloader.html)
1414

15-
由于篇幅问题,这里就不放 JVM 部分的常见面试题了。
16-
17-
![](https://img-blog.csdnimg.cn/afb9d3be87c64179b8134bc298d33b45.png)
18-
1915
<div align="center">
2016
<img src="https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png" style="margin: 0 auto;" />
2117
</div>

docs/c-3数据结构.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
77
数据结构这部分的基础知识已经总结完成。
88

9-
由于篇幅问题,这里直接放网站上的文章链接,小伙伴可以根据个人需求自行学习:
9+
由于篇幅问题,这里直接放 JavaGuide 在线网站网站上的文章链接,小伙伴可以根据个人需求自行学习:
1010

1111
- [线性数据结构 :数组、链表、栈、队列](https://javaguide.cn/cs-basics/data-structure/linear-data-structure.html)
1212
- [](https://javaguide.cn/cs-basics/data-structure/graph.html)

docs/c-4算法.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,5 @@
1515

1616
<div align="center">
1717
<img src="https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png" style="margin: 0 auto;" />
18-
</div>
18+
</div>
19+

docs/g-3分布式锁.md

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
------
2+
3+
## 7.4 分布式锁
4+
5+
网上有很多分布式锁相关的文章,写了一个相对简洁易懂的版本,针对面试和工作完全够用了。
6+
7+
### 什么是分布式锁?
8+
9+
对于单机多线程,在 Java 中,我们通常使用 `ReetrantLock` 这类 JDK 自带的 **本地锁** 来控制本地多个线程对本地共享资源的访问。对于分布式系统,我们通常使用 **分布式锁** 来控制多个服务对共享资源的访问。
10+
11+
一个最基本的分布式锁需要满足:
12+
13+
- **互斥** :任意一个时刻,锁只能被一个线程持有;
14+
- **高可用** :锁服务是高可用的。并且,即使客户端的释放锁的代码逻辑出现问题,锁最终一定还是会被释放,不会影响其他线程对共享资源的访问。
15+
16+
通常情况下,我们一般会选择基于 Redis 或者 ZooKeeper 实现分布式锁,Redis 用的要更多一点,我这里也以 Redis 为例介绍分布式锁的实现。
17+
18+
### 基于 Redis 实现分布式锁
19+
20+
#### 如何基于 Redis 实现一个最简易的分布式锁?
21+
22+
不论是实现锁还是分布式锁,核心都在于“互斥”。
23+
24+
在 Redis 中, `SETNX` 命令是可以帮助我们实现互斥。`SETNX`**SET** if **N**ot e**X**ists (对应 Java 中的 `setIfAbsent` 方法),如果 key 不存在的话,才会设置 key 的值。如果 key 已经存在, `SETNX` 啥也不做。
25+
26+
```bash
27+
> SETNX lockKey uniqueValue
28+
(integer) 1
29+
> SETNX lockKey uniqueValue
30+
(integer) 0
31+
```
32+
33+
释放锁的话,直接通过 `DEL` 命令删除对应的 key 即可。
34+
35+
```bash
36+
> DEL lockKey
37+
(integer) 1
38+
```
39+
40+
为了误删到其他的锁,这里我们建议使用 Lua 脚本通过 key 对应的 value(唯一值)来判断。
41+
42+
选用 Lua 脚本是为了保证解锁操作的原子性。因为 Redis 在执行 Lua 脚本时,可以以原子性的方式执行,从而保证了锁释放操作的原子性。
43+
44+
```lua
45+
// 释放锁时,先比较锁对应的 value 值是否相等,避免锁的误释放
46+
if redis.call("get",KEYS[1]) == ARGV[1] then
47+
return redis.call("del",KEYS[1])
48+
else
49+
return 0
50+
end
51+
```
52+
53+
这是一种最简易的 Redis 分布式锁实现,实现方式比较简单,性能也很高效。不过,这种方式实现分布式锁存在一些问题。就比如应用程序遇到一些问题比如释放锁的逻辑突然挂掉,可能会导致锁无法被释放,进而造成共享资源无法再被其他线程/进程访问。
54+
55+
#### 为什么要给锁设置一个过期时间?
56+
57+
为了避免锁无法被释放,我们可以想到的一个解决办法就是:给这个 key(也就是锁) 设置一个过期时间。
58+
59+
```bash
60+
127.0.0.1:6379> SET lockKey uniqueValue EX 3 NX
61+
OK
62+
```
63+
64+
- **lockKey** :加锁的锁名;
65+
- **uniqueValue** :能够唯一标示锁的随机字符串;
66+
- **NX** :只有当 lockKey 对应的 key 值不存在的时候才能 SET 成功;
67+
- **EX** :过期时间设置(秒为单位)EX 3 标示这个锁有一个 3 秒的自动过期时间。与 EX 对应的是 PX(毫秒为单位),这两个都是过期时间设置。
68+
69+
**一定要保证设置指定 key 的值和过期时间是一个原子操作!!!** 不然的话,依然可能会出现锁无法被释放的问题。
70+
71+
这样确实可以解决问题,不过,这种解决办法同样存在漏洞:**如果操作共享资源的时间大于过期时间,就会出现锁提前过期的问题,进而导致分布式锁直接失效。如果锁的超时时间设置过长,又会影响到性能。**
72+
73+
你或许在想: **如果操作共享资源的操作还未完成,锁过期时间能够自己续期就好了!**
74+
75+
对于 Java 开发的小伙伴来说,已经有了现成的解决方案:**[Redisson](https://github.com/redisson/redisson)** 。其他语言的解决方案,可以在 Redis 官方文档中找到,地址:https://redis.io/topics/distlock
76+
77+
![Distributed locks with Redis](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/redis-distributed-lock.png)
78+
79+
Redisson 是一个开源的 Java 语言 Redis 客户端,提供了很多开箱即用的功能,不仅仅包括多种分布式锁的实现。
80+
81+
Redisson 中的分布式锁自带自动续期机制,它提供了一个专门用来监控锁的 **Watch Dog( 看门狗)**,如果操作共享资源的还未完成的话,Watch Dog 会不断地延长锁的过期时间,进而保证锁不会因为超时而被释放。
82+
83+
我这里以 Redisson 的分布式可重入锁 `RLock` 为例来说明如何使用 Redisson 实现分布式锁:
84+
85+
```java
86+
// 1.获取指定的分布式锁对象
87+
RLock lock = redisson.getLock("lock");
88+
// 2.拿锁,具有 Watch Dog 自动续期机制
89+
lock.lock();
90+
// 3.执行业务
91+
...
92+
// 4.释放锁
93+
lock.unlock();
94+
```
95+
96+
可以看出,代码非常简洁直观。
97+
98+
如果使用 Redis 来实现分布式锁的话,还是比较推荐直接基于 Redisson 来做的。
99+
100+
#### Redis 如何解决集群情况下分布式锁的可靠性?
101+
102+
为了避免单点故障,生产环境下的 Redis 服务通常是集群化部署的。
103+
104+
Redis 集群下,上面介绍到的分布式锁的实现会存在一些问题。由于 Redis 集群数据同步到各个节点时是异步的,如果在 Redis 主节点获取到锁后,在没有同步到其他节点时,Redis 主节点宕机了,此时新的 Redis 主节点依然可以获取锁,所以多个应用服务就可以同时获取到锁。
105+
106+
针对这个问题,Redis 之父 antirez 设计了 [Redlock 算法](https://redis.io/topics/distlock) 来解决。
107+
108+
Redlock 算法的思想是让客户端向 Redis 集群中的多个独立的 Redis 实例依次请求申请加锁,如果客户端能够和半数以上的实例成功地完成加锁操作,那么我们就认为,客户端成功地获得分布式锁,否则加锁失败。
109+
110+
即使部分 Redis 节点出现问题,只要保证 Redis 集群中有半数以上的 Redis 节点可用,分布式锁服务就是正常的。
111+
112+
Redlock 是直接操作 Redis 节点的,并不是通过 Redis 集群操作的,这样才可以避免 Redis 集群主从切换导致的锁丢失问题。
113+
114+
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 的激烈辩论。
115+
116+
实际项目中不建议使用 Redlock 算法,成本和收益不成正比。
117+
118+
如果不是非要实现绝对可靠的分布式锁的话,其实单机版 Redis 就完全够了,实现简单,性能也非常高。如果你必须要实现一个绝对可靠的分布式锁的话,可以基于 Zookeeper 来做,只是性能会差一些。

docs/g-4rpc.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
------
2+
3+
## 7.5 RPC
4+
5+
> [JavaGuide](https://javaguide.cn/) :「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!
6+
7+
RPC 这部分目前已经总结了 RPC 基础常见面试题和 Dubbo 常见面试题。
8+
9+
由于篇幅问题,这里直接放 JavaGuide 在线网站网站上的文章链接,小伙伴可以根据个人需求自行学习:
10+
11+
- [RPC 基础常见面试题总结](https://javaguide.cn/distributed-system/rpc/rpc-intro.html)
12+
- [Dubbo 常见面试题总结](https://javaguide.cn/distributed-system/rpc/dubbo.html)
13+
14+
<div align="center">
15+
<img src="https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png" style="margin: 0 auto;" />
16+
</div>

docs/g-5分布式事务(付费).md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
------
2+
3+
## 7.6 分布式事务(付费)
4+
5+
> [JavaGuide](https://javaguide.cn/) :「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!
6+
7+
**分布式事务** 相关的面试题为我的[知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)(点击链接即可查看详细介绍以及获取方法)中。
8+
9+
[《Java 面试指北》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7) 的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn/#/) 的补充完善,两者可以配合使用。
10+
11+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304102536445.png)
12+
13+
[《Java 面试指北》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)只是星球内部众多资料中的一个,星球还有很多其他优质资料比如[专属专栏](https://javaguide.cn/zhuanlan/)、Java 编程视频、PDF 资料。
14+
15+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png)
16+
17+
最近几年,市面上有越来越多的“技术大佬”开始办培训班/训练营,动辄成千上万的学费,却并没有什么干货,单纯的就是割韭菜。
18+
19+
为了帮助更多同学准备 Java 面试以及学习 Java ,我创建了一个纯粹的[知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)。虽然收费只有培训班/训练营的百分之一,但是[知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)里的内容质量更高,提供的服务也更全面。
20+
21+
欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc),干货非常多,学习氛围非常好!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。
22+
23+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220311203414600.png)
24+
25+
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
26+
27+
<div align="center">
28+
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
29+
<img src="https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/xingqiufuwu.png" style="margin: 0 auto; " />
30+
</a>
31+
</div>
32+
33+
34+
我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!
35+
36+
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)(文末有优惠券)。
37+
38+
<div align="center">
39+
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
40+
<img src="https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/xingqiuyouhuijuanheyi.png" style="margin: 0 auto; " />
41+
</a>
42+
</div>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
------
2+
3+
## 7.7 分布式协调(ZooKeeper)
4+
5+
> [JavaGuide](https://javaguide.cn/) :「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!
6+
7+
由于篇幅问题,这里直接放 JavaGuide 在线网站网站上的文章链接,小伙伴可以根据个人需求自行学习:
8+
9+
- [ZooKeeper 相关概念总结(入门)](https://javaguide.cn/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.html)
10+
- [ZooKeeper 相关概念总结(进阶)](https://javaguide.cn/distributed-system/distributed-process-coordination/zookeeper/zookeeper-plus.html)
11+
- [ZooKeeper 实战](https://javaguide.cn/distributed-system/distributed-process-coordination/zookeeper/zookeeper-in-action.html)
12+
13+
<div align="center">
14+
<img src="https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png" style="margin: 0 auto;" />
15+
</div>

0 commit comments

Comments
 (0)