Skip to content

Commit e0ead3e

Browse files
committed
docs: update articles
1 parent 94e3510 commit e0ead3e

File tree

63 files changed

+823
-813
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+823
-813
lines changed

.prettierrc

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"tabWidth": 4,
3+
"useTabs": false,
4+
"semi": true,
5+
"singleQuote": true,
6+
"trailingComma": "all",
7+
"bracketSpacing": true,
8+
"jsxBracketSameLine": false,
9+
"arrowParens": "avoid"
10+
}

README.md

+92-92
Large diffs are not rendered by default.

docs/big-data/README.md

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
# 海量数据处理
22

3-
- [如何从大量的 URL 中找出相同的 URL?](/docs/big-data/find-common-urls.md)
4-
- [如何从大量数据中找出高频词?](/docs/big-data/find-top-100-words.md)
5-
- [如何找出某一天访问百度网站最多的 IP?](/docs/big-data/find-top-1-ip.md)
6-
- [如何在大量的数据中找出不重复的整数?](/docs/big-data/find-no-repeat-number.md)
7-
- [如何在大量的数据中判断一个数是否存在?](/docs/big-data/find-a-number-if-exists.md)
8-
- [如何查询最热门的查询串?](/docs/big-data/find-hotest-query-string.md)
9-
- [如何统计不同电话号码的个数?](/docs/big-data/count-different-phone-numbers.md)
10-
- [如何从 5 亿个数中找出中位数?](/docs/big-data/find-mid-value-in-500-millions.md)
11-
- [如何按照 query 的频度排序?](/docs/big-data/sort-the-query-strings-by-counts.md)
12-
- [如何找出排名前 500 的数?](/docs/big-data/find-rank-top-500-numbers.md)
3+
- [如何从大量的 URL 中找出相同的 URL?](/docs/big-data/find-common-urls.md)
4+
- [如何从大量数据中找出高频词?](/docs/big-data/find-top-100-words.md)
5+
- [如何找出某一天访问百度网站最多的 IP?](/docs/big-data/find-top-1-ip.md)
6+
- [如何在大量的数据中找出不重复的整数?](/docs/big-data/find-no-repeat-number.md)
7+
- [如何在大量的数据中判断一个数是否存在?](/docs/big-data/find-a-number-if-exists.md)
8+
- [如何查询最热门的查询串?](/docs/big-data/find-hotest-query-string.md)
9+
- [如何统计不同电话号码的个数?](/docs/big-data/count-different-phone-numbers.md)
10+
- [如何从 5 亿个数中找出中位数?](/docs/big-data/find-mid-value-in-500-millions.md)
11+
- [如何按照 query 的频度排序?](/docs/big-data/sort-the-query-strings-by-counts.md)
12+
- [如何找出排名前 500 的数?](/docs/big-data/find-rank-top-500-numbers.md)
1313

1414
---
1515

docs/big-data/find-no-repeat-number.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ for i in range(8):
4848

4949
**那么对于这道题**,我们用 2 个 bit 来表示各个数字的状态:
5050

51-
- 00 表示这个数字没出现过;
52-
- 01 表示这个数字出现过一次(即为题目所找的不重复整数);
53-
- 10 表示这个数字出现了多次。
51+
- 00 表示这个数字没出现过;
52+
- 01 表示这个数字出现过一次(即为题目所找的不重复整数);
53+
- 10 表示这个数字出现了多次。
5454

5555
那么这 2<sup>32</sup> 个整数,总共所需内存为 2<sup>32</sup>\*2b=1GB。因此,当可用内存超过 1GB 时,可以采用位图法。假设内存满足位图法需求,进行下面的操作:
5656

docs/big-data/sort-the-query-strings-by-counts.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@
2020

2121
### 方法总结
2222

23-
- 内存若够,直接读入进行排序;
24-
- 内存不够,先划分为小文件,小文件排好序后,整理使用外排序进行归并。
23+
- 内存若够,直接读入进行排序;
24+
- 内存不够,先划分为小文件,小文件排好序后,整理使用外排序进行归并。

docs/distributed-system/README.md

+14-14
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,32 @@
44

55
## 系统拆分
66

7-
- [为什么要进行系统拆分?如何进行系统拆分?拆分后不用 Dubbo 可以吗?](/docs/distributed-system/why-dubbo.md)
7+
- [为什么要进行系统拆分?如何进行系统拆分?拆分后不用 Dubbo 可以吗?](/docs/distributed-system/why-dubbo.md)
88

99
## 分布式服务框架
1010

11-
- [说一下 Dubbo 的工作原理?注册中心挂了可以继续通信吗?](/docs/distributed-system/dubbo-operating-principle.md)
12-
- [Dubbo 支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的?](/docs/distributed-system/dubbo-serialization-protocol.md)
13-
- [Dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?](/docs/distributed-system/dubbo-load-balancing.md)
14-
- [Dubbo 的 SPI 思想是什么?](/docs/distributed-system/dubbo-spi.md)
15-
- [如何基于 Dubbo 进行服务治理、服务降级、失败重试以及超时重试?](/docs/distributed-system/dubbo-service-management.md)
16-
- [分布式服务接口的幂等性如何设计(比如不能重复扣款)?](/docs/distributed-system/distributed-system-idempotency.md)
17-
- [分布式服务接口请求的顺序性如何保证?](/docs/distributed-system/distributed-system-request-sequence.md)
18-
- [如何自己设计一个类似 Dubbo 的 RPC 框架?](/docs/distributed-system/dubbo-rpc-design.md)
19-
- [CAP 定理的 P 是什么](/docs/distributed-system/distributed-system-cap.md)
11+
- [说一下 Dubbo 的工作原理?注册中心挂了可以继续通信吗?](/docs/distributed-system/dubbo-operating-principle.md)
12+
- [Dubbo 支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的?](/docs/distributed-system/dubbo-serialization-protocol.md)
13+
- [Dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?](/docs/distributed-system/dubbo-load-balancing.md)
14+
- [Dubbo 的 SPI 思想是什么?](/docs/distributed-system/dubbo-spi.md)
15+
- [如何基于 Dubbo 进行服务治理、服务降级、失败重试以及超时重试?](/docs/distributed-system/dubbo-service-management.md)
16+
- [分布式服务接口的幂等性如何设计(比如不能重复扣款)?](/docs/distributed-system/distributed-system-idempotency.md)
17+
- [分布式服务接口请求的顺序性如何保证?](/docs/distributed-system/distributed-system-request-sequence.md)
18+
- [如何自己设计一个类似 Dubbo 的 RPC 框架?](/docs/distributed-system/dubbo-rpc-design.md)
19+
- [CAP 定理的 P 是什么](/docs/distributed-system/distributed-system-cap.md)
2020

2121
## 分布式锁
2222

23-
- [Zookeeper 都有哪些应用场景?](/docs/distributed-system/zookeeper-application-scenarios.md)
24-
- [使用 Redis 如何设计分布式锁?使用 Zookeeper 来设计分布式锁可以吗?以上两种分布式锁的实现方式哪种效率比较高?](/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md)
23+
- [Zookeeper 都有哪些应用场景?](/docs/distributed-system/zookeeper-application-scenarios.md)
24+
- [使用 Redis 如何设计分布式锁?使用 Zookeeper 来设计分布式锁可以吗?以上两种分布式锁的实现方式哪种效率比较高?](/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md)
2525

2626
## 分布式事务
2727

28-
- [分布式事务了解吗?你们如何解决分布式事务问题的?TCC 如果出现网络连不通怎么办?XA 的一致性如何保证?](/docs/distributed-system/distributed-transaction.md)
28+
- [分布式事务了解吗?你们如何解决分布式事务问题的?TCC 如果出现网络连不通怎么办?XA 的一致性如何保证?](/docs/distributed-system/distributed-transaction.md)
2929

3030
## 分布式会话
3131

32-
- [集群部署时的分布式 Session 如何实现?](/docs/distributed-system/distributed-session.md)
32+
- [集群部署时的分布式 Session 如何实现?](/docs/distributed-system/distributed-session.md)
3333

3434
---
3535

docs/distributed-system/distributed-lock-redis-vs-zookeeper.md

+8-8
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@
1414

1515
这个分布式锁有 3 个重要的考量点:
1616

17-
- 互斥(只能有一个客户端获取锁)
18-
- 不能死锁
19-
- 容错(只要大部分 Redis 节点创建了这把锁就可以)
17+
- 互斥(只能有一个客户端获取锁)
18+
- 不能死锁
19+
- 容错(只要大部分 Redis 节点创建了这把锁就可以)
2020

2121
#### Redis 最普通的分布式锁
2222

2323
第一个最普通的实现方式,就是在 Redis 里使用 `SET key value [EX seconds] [PX milliseconds] NX` 创建一个 key,这样就算加锁。其中:
2424

25-
- `NX`:表示只有 `key` 不存在的时候才会设置成功,如果此时 redis 中存在这个 `key`,那么设置失败,返回 `nil`
26-
- `EX seconds`:设置 `key` 的过期时间,精确到秒级。意思是 `seconds` 秒后锁自动释放,别人创建的时候如果发现已经有了就不能加锁了。
27-
- `PX milliseconds`:同样是设置 `key` 的过期时间,精确到毫秒级。
25+
- `NX`:表示只有 `key` 不存在的时候才会设置成功,如果此时 redis 中存在这个 `key`,那么设置失败,返回 `nil`
26+
- `EX seconds`:设置 `key` 的过期时间,精确到秒级。意思是 `seconds` 秒后锁自动释放,别人创建的时候如果发现已经有了就不能加锁了。
27+
- `PX milliseconds`:同样是设置 `key` 的过期时间,精确到毫秒级。
2828

2929
比如执行以下命令:
3030

@@ -332,8 +332,8 @@ public class ZooKeeperDistributedLock implements Watcher {
332332

333333
### redis 分布式锁和 zk 分布式锁的对比
334334

335-
- redis 分布式锁,其实**需要自己不断去尝试获取锁**,比较消耗性能。
336-
- zk 分布式锁,获取不到锁,注册个监听器即可,不需要不断主动尝试获取锁,性能开销较小。
335+
- redis 分布式锁,其实**需要自己不断去尝试获取锁**,比较消耗性能。
336+
- zk 分布式锁,获取不到锁,注册个监听器即可,不需要不断主动尝试获取锁,性能开销较小。
337337

338338
另外一点就是,如果是 Redis 获取锁的那个客户端 出现 bug 挂了,那么只能等待超时时间之后才能释放锁;而 zk 的话,因为创建的是临时 znode,只要客户端挂了,znode 就没了,此时就自动释放锁。
339339

docs/distributed-system/distributed-system-cap.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@
88

99
在理论计算机科学中,CAP 定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
1010

11-
- 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)
12-
- 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
13-
- 分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在 C 和 A 之间做出选择。)
11+
- 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)
12+
- 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
13+
- 分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在 C 和 A 之间做出选择。)
1414

1515
### 分区容错性(Partition tolerance)
1616

1717
理解 CAP 理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了 C 性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了 A 性质。除非两个节点可以互相通信,才能既保证 C 又保证 A,这又会导致丧失 P 性质。
1818

19-
- P 指的是分区容错性,分区现象产生后需要容错,容错是指在 A 与 C 之间选择。如果分布式系统没有分区现象(没有出现不一致不可用情况) 本身就没有分区 ,既然没有分区则就更没有分区容错性 P。
20-
- 无论我设计的系统是 AP 还是 CP 系统如果没有出现不一致不可用。 则该系统就处于 CA 状态
21-
- P 的体现前提是得有分区情况存在
19+
- P 指的是分区容错性,分区现象产生后需要容错,容错是指在 A 与 C 之间选择。如果分布式系统没有分区现象(没有出现不一致不可用情况) 本身就没有分区 ,既然没有分区则就更没有分区容错性 P。
20+
- 无论我设计的系统是 AP 还是 CP 系统如果没有出现不一致不可用。 则该系统就处于 CA 状态
21+
- P 的体现前提是得有分区情况存在
2222

2323
> 文章来源:[维基百科 CAP 定理](https://zh.wikipedia.org/wiki/CAP%E5%AE%9A%E7%90%86)
2424

docs/distributed-system/distributed-system-idempotency.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222

2323
其实保证幂等性主要是三点:
2424

25-
- 对于每个请求必须有一个唯一的标识,举个栗子:订单支付请求,肯定得包含订单 id,一个订单 id 最多支付一次,对吧。
26-
- 每次处理完请求之后,必须有一个记录标识这个请求处理过了。常见的方案是在 mysql 中记录个状态啥的,比如支付之前记录一条这个订单的支付流水。
27-
- 每次接收请求需要进行判断,判断之前是否处理过。比如说,如果有一个订单已经支付了,就已经有了一条支付流水,那么如果重复发送这个请求,则此时先插入支付流水,orderId 已经存在了,唯一键约束生效,报错插入不进去的。然后你就不用再扣款了。
25+
- 对于每个请求必须有一个唯一的标识,举个栗子:订单支付请求,肯定得包含订单 id,一个订单 id 最多支付一次,对吧。
26+
- 每次处理完请求之后,必须有一个记录标识这个请求处理过了。常见的方案是在 mysql 中记录个状态啥的,比如支付之前记录一条这个订单的支付流水。
27+
- 每次接收请求需要进行判断,判断之前是否处理过。比如说,如果有一个订单已经支付了,就已经有了一条支付流水,那么如果重复发送这个请求,则此时先插入支付流水,orderId 已经存在了,唯一键约束生效,报错插入不进去的。然后你就不用再扣款了。
2828

2929
实际运作过程中,你要结合自己的业务来,比如说利用 Redis,用 orderId 作为唯一键。只有成功插入这个支付流水,才可以执行实际的支付扣款。
3030

docs/distributed-system/distributed-system-interview.md

+12-12
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,27 @@
1212

1313
### 为什么要进行系统拆分?
1414

15-
- 为什么要进行系统拆分?如何进行系统拆分?拆分后不用 Dubbo 可以吗?Dubbo 和 thrift 有什么区别呢?
15+
- 为什么要进行系统拆分?如何进行系统拆分?拆分后不用 Dubbo 可以吗?Dubbo 和 thrift 有什么区别呢?
1616

1717
### 分布式服务框架
1818

19-
- 说一下的 Dubbo 的工作原理?注册中心挂了可以继续通信吗?
20-
- Dubbo 支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的?
21-
- Dubbo 负载均衡策略和高可用策略都有哪些?动态代理策略呢?
22-
- Dubbo 的 SPI 思想是什么?
23-
- 如何基于 Dubbo 进行服务治理、服务降级、失败重试以及超时重试?
24-
- 分布式服务接口的幂等性如何设计(比如不能重复扣款)?
25-
- 分布式服务接口请求的顺序性如何保证?
26-
- 如何自己设计一个类似 Dubbo 的 RPC 框架?
19+
- 说一下的 Dubbo 的工作原理?注册中心挂了可以继续通信吗?
20+
- Dubbo 支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的?
21+
- Dubbo 负载均衡策略和高可用策略都有哪些?动态代理策略呢?
22+
- Dubbo 的 SPI 思想是什么?
23+
- 如何基于 Dubbo 进行服务治理、服务降级、失败重试以及超时重试?
24+
- 分布式服务接口的幂等性如何设计(比如不能重复扣款)?
25+
- 分布式服务接口请求的顺序性如何保证?
26+
- 如何自己设计一个类似 Dubbo 的 RPC 框架?
2727

2828
### 分布式锁
2929

30-
- 使用 Redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?
30+
- 使用 Redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?
3131

3232
### 分布式事务
3333

34-
- 分布式事务了解吗?你们如何解决分布式事务问题的?TCC 如果出现网络连不通怎么办?XA 的一致性如何保证?
34+
- 分布式事务了解吗?你们如何解决分布式事务问题的?TCC 如果出现网络连不通怎么办?XA 的一致性如何保证?
3535

3636
### 分布式会话
3737

38-
- 集群部署时的分布式 Session 如何实现?
38+
- 集群部署时的分布式 Session 如何实现?

docs/distributed-system/distributed-transaction.md

+15-15
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212

1313
分布式事务的实现主要有以下 6 种方案:
1414

15-
- XA 方案
16-
- TCC 方案
17-
- SAGA 方案
18-
- 本地消息表
19-
- 可靠消息最终一致性方案
20-
- 最大努力通知方案
15+
- XA 方案
16+
- TCC 方案
17+
- SAGA 方案
18+
- 本地消息表
19+
- 可靠消息最终一致性方案
20+
- 最大努力通知方案
2121

2222
### 两阶段提交方案/XA 方案
2323

@@ -37,9 +37,9 @@
3737

3838
TCC 的全称是: `Try``Confirm``Cancel`
3939

40-
- Try 阶段:这个阶段说的是对各个服务的资源做检测以及对资源进行**锁定或者预留**
41-
- Confirm 阶段:这个阶段说的是在各个服务中**执行实际的操作**
42-
- Cancel 阶段:如果任何一个服务的业务方法执行出错,那么这里就需要**进行补偿**,就是执行已经执行成功的业务逻辑的回滚操作。(把那些执行成功的回滚)
40+
- Try 阶段:这个阶段说的是对各个服务的资源做检测以及对资源进行**锁定或者预留**
41+
- Confirm 阶段:这个阶段说的是在各个服务中**执行实际的操作**
42+
- Cancel 阶段:如果任何一个服务的业务方法执行出错,那么这里就需要**进行补偿**,就是执行已经执行成功的业务逻辑的回滚操作。(把那些执行成功的回滚)
4343

4444
这种方案说实话几乎很少人使用,我们用的也比较少,但是也有使用的场景。因为这个**事务回滚**实际上是**严重依赖于你自己写代码来回滚和补偿**了,会造成补偿代码巨大,非常之恶心。
4545

@@ -69,18 +69,18 @@ TCC 的全称是: `Try` 、 `Confirm` 、 `Cancel` 。
6969

7070
所以 Saga 模式的适用场景是:
7171

72-
- 业务流程长、业务流程多;
73-
- 参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口。
72+
- 业务流程长、业务流程多;
73+
- 参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口。
7474

7575
#### 优势
7676

77-
- 一阶段提交本地事务,无锁,高性能;
78-
- 参与者可异步执行,高吞吐;
79-
- 补偿服务易于实现,因为一个更新操作的反向操作是比较容易理解的。
77+
- 一阶段提交本地事务,无锁,高性能;
78+
- 参与者可异步执行,高吞吐;
79+
- 补偿服务易于实现,因为一个更新操作的反向操作是比较容易理解的。
8080

8181
#### 缺点
8282

83-
- 不保证事务的隔离性。
83+
- 不保证事务的隔离性。
8484

8585
### 本地消息表
8686

docs/distributed-system/dubbo-load-balancing.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略
88

99
说白了,就是看你对 dubbo 熟悉不熟悉:
1010

11-
- dubbo 工作原理:服务注册、注册中心、消费者、代理通信、负载均衡;
12-
- 网络通信、序列化:dubbo 协议、长连接、NIO、hessian 序列化协议;
13-
- 负载均衡策略、集群容错策略、动态代理策略:dubbo 跑起来的时候一些功能是如何运转的?怎么做负载均衡?怎么做集群容错?怎么生成动态代理?
14-
- dubbo SPI 机制:你了解不了解 dubbo 的 SPI 机制?如何基于 SPI 机制对 dubbo 进行扩展?
11+
- dubbo 工作原理:服务注册、注册中心、消费者、代理通信、负载均衡;
12+
- 网络通信、序列化:dubbo 协议、长连接、NIO、hessian 序列化协议;
13+
- 负载均衡策略、集群容错策略、动态代理策略:dubbo 跑起来的时候一些功能是如何运转的?怎么做负载均衡?怎么做集群容错?怎么生成动态代理?
14+
- dubbo SPI 机制:你了解不了解 dubbo 的 SPI 机制?如何基于 SPI 机制对 dubbo 进行扩展?
1515

1616
## 面试题剖析
1717

0 commit comments

Comments
 (0)