From 26e097755836d234c57a82c5f6fbead7c2aded07 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Mon, 19 Nov 2018 09:47:39 +0800 Subject: [PATCH] docs(distributed-system): add distributed-system-interview.md --- README.md | 2 +- .../distributed-system-interview.md | 30 ++++++++++++++++++ .../redis-production-environment.md | 2 +- img/simple-distributed-system-oa.png | Bin 0 -> 34434 bytes 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 docs/distributed-system/distributed-system-interview.md create mode 100644 img/simple-distributed-system-oa.png diff --git a/README.md b/README.md index 7b52615..451cd90 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ 本系列知识出自中华石杉,我对这部分知识做了一个系统的整理,方便学习查阅。 -## 分布式系统 +## [分布式系统](/docs/distributed-system/distributed-system-interview.md) ### 系统拆分 - 为什么要进行系统拆分? diff --git a/docs/distributed-system/distributed-system-interview.md b/docs/distributed-system/distributed-system-interview.md new file mode 100644 index 0000000..6a63bb1 --- /dev/null +++ b/docs/distributed-system/distributed-system-interview.md @@ -0,0 +1,30 @@ +## 分布式系统面试连环炮 +有一些同学,之前呢主要是做传统行业,或者外包项目,一直是在那种小的公司,技术一直都搞的比较简单。他们有共同的一个问题,就是都没怎么搞过分布式系统,现在互联网公司,一般都是做分布式的系统,大家都不是做底层的分布式系统、分布式存储系统 hadoop hdfs、分布式计算系统 hadoop mapreduce / spark、分布式流式计算系统 storm。 + +分布式业务系统,就是把原来用 Java 开发的一个大块系统,给拆分成**多个子系统**,多个子系统之间互相调用,形成一个大系统的整体。假设原来你做了一个 OA 系统,里面包含了权限模块、员工模块、请假模块、财务模块,一个工程,里面包含了一堆模块,模块与模块之间会互相去调用,1 台机器部署。现在如果你把这个系统给拆开,权限系统、员工系统、请假系统、财务系统 4 个系统,4 个工程,分别在 4 台机器上部署。一个请求过来,完成这个请求,这个员工系统,调用权限系统,调用请假系统,调用财务系统,4 个系统分别完成了一部分的事情,最后 4 个系统都干完了以后,才认为是这个请求已经完成了。 + +![simple-distributed-system-oa](/img/simple-distributed-system-oa.png) + +> 这两年开始兴起和流行 Spring Cloud,刚流行,还没开始普及,目前普及的是 dubbo,因此这里也主要讲 dubbo。 + +面试官可能会问你以下问题。 +### 为什么要进行系统拆分? +- 为什么要进行系统拆分?如何进行系统拆分?拆分后不用dubbo可以吗?dubbo和thrift有什么区别呢? +### 分布式服务框架 +- 说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗? +- dubbo 支持哪些序列化协议?说一下 hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的? +- dubbo 负载均衡策略和高可用策略都有哪些?动态代理策略呢? +- dubbo 的 spi 思想是什么? +- 如何基于 dubbo 进行服务治理、服务降级、失败重试以及超时重试? +- 分布式服务接口的幂等性如何设计(比如不能重复扣款)? +- 分布式服务接口请求的顺序性如何保证? +- 如何自己设计一个类似 dubbo 的 rpc 框架? + +### 分布式锁 +- 使用 redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高? + +### 分布式事务 +- 分布式事务了解吗?你们如何解决分布式事务问题的?TCC 如果出现网络连不通怎么办?XA 的一致性如何保证? + +### 分布式会话 +- 集群部署时的分布式 session 如何实现? diff --git a/docs/high-concurrency/redis-production-environment.md b/docs/high-concurrency/redis-production-environment.md index 1cc2ba4..3048fd2 100644 --- a/docs/high-concurrency/redis-production-environment.md +++ b/docs/high-concurrency/redis-production-environment.md @@ -13,7 +13,7 @@ redis cluster,10 台机器,5 台机器部署了 redis 主实例,另外 5 5 台机器对外提供读写,一共有 50g 内存。 -因为每个主实例都挂了一个从实例,所以是高可用的,任何一个主实例宕机,都会自动故障迁移,redis 从实例会自动变成主实例继续提供读写服务 +因为每个主实例都挂了一个从实例,所以是高可用的,任何一个主实例宕机,都会自动故障迁移,redis 从实例会自动变成主实例继续提供读写服务。 你往内存里写的是什么数据?每条数据的大小是多少?商品数据,每条数据是 10kb。100 条数据是 1mb,10 万条数据是 1g。常驻内存的是 200 万条商品数据,占用内存是 20g,仅仅不到总内存的 50%。目前高峰期每秒就是 3500 左右的请求量。 diff --git a/img/simple-distributed-system-oa.png b/img/simple-distributed-system-oa.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9f35b70b414803e17b3a8ab9359d34576e32b2 GIT binary patch literal 34434 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 z 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 AS^xk5 literal 0 HcmV?d00001 -- GitLab