JAVA分布式架构完整知识体系
2. 流程
?1. `命中`:应用程序从 cache 中取数据,取到后返回。
?2. `失效`:应用程序先从 cache 取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
?3. `更新`:先把数据存到数据库中,成功后,再让缓存失效。
3. 常见问题:
?1. `先更新数据库,再更新缓存`:两个并发的写操作导致脏数据
1. 在Read/Write Through 模式中,缓存代理了DB读取、写入的逻辑,可以把缓存看成唯一的存储。先更新缓存,缓存负责同步更新数据库。
2. Read Through: 模式就是在查询操作中更新缓存,也就是说,当缓存失效的时候,Cache Aside 模式是由调用方负责把数据加载入缓存,而 Read Through 则用缓存服务自己来加载。
3. Write Through 模式和 Read Through 相仿,不过是在更新数据时发生。当有数据更新的时候,如果没有命中缓存,直接更新数据库,然后返回。如果命中了缓存,则更新缓存,然后由缓存自己更新数据库(这是一个同步操作)。
* 这种模式下所有的操作都走缓存,缓存里的数据再通过异步的方式同步到数据库里面。所以系统的写性能能够大大提升。
4. 三种模式总结
1. Cache Aside 更新模式简单
2. Read/Write Through 更新模式只需要维护缓存
3. Write Behind Caching 更新模式异步,处理并发高,但牺牲了强一致性
4. 缓存一定要合理的设置过期时间
### 二、缓存的失效机制 `参考附录2`
1. 主动失效
2. 被动失效
### 三、缓存的淘汰策略 `参考附录2`
1. LRU
2. LFU
3. FIFO
### 四、缓存穿透、缓存击穿、缓存雪崩 `参考附录2`
1. 缓存穿透
2. 缓存击穿
3. 缓存雪崩
### 五、缓存设计时几个需要关注的点 `参考附录2`
1. 不要把所有的数据都加载到缓存中。
2. 缓存需要有一个失效机制。
3. 缓存的代价是牺牲了数据的强一致性。
### 六、缓存中的热key和大value问题 `参考附录2`
1. 在分布式缓存中,面对高并发要求有两个问题非常重要:热key问题(hot key)和大value(big value)问题。
?1. 热key问题:是指缓存集群中的某个key在瞬间被数万甚至十万的并发请求打爆。
?2. 大value问题:是指某个key对应的value可能有gb级别的大小,导致查询value的时候会引发网络相关的故障问题。
2. 热key问题定义
1. 热key问题是指:突然有几十万甚至更大的请求去访问redis上的某个特定key。这样会造成流量过于集中,达到Redis单实例瓶颈(一般是10W QPS级别),或者物理网卡上限,从而导致这台redis的服务器Hold不住,直到缓存服务器垮掉。
2. 发现热key
?1. 按业务场景,预估热点key(常用)
?2. 客户端收集(常用)
?3. 代理层收集
?4. redis监控命令(常用)
?5. 网络抓包分析
?6. 基于大数据流式计算技术的缓存热点自动发现
3. 解决方案
4. 总结
?1. 每台redis上限10w/s QPS
?2. redis集群提高并发能力
## 分布式锁 `参考附录3`
### 一、为什么要使用分布式锁?
### 二、分布式锁需要具备的条件
### 三、分布式锁的三种实现方式
1. 基于数据库的实现方式
2. 基于Redis的实现方式
3. 基于zookeeper的实现方式
### 四、三种方式对比
## 分布式事务 `参考附录4`
### 一、两阶段提交(2PC)
1. 两阶段
2. 具体流程
3. 存在的问题
### 二、三阶段提交(3PC)
1. 三阶段
2. 具体流程
3. 总结
### 三、补偿事务(TCC)
1. TCC
2. 优缺点
### 四、本地消息表(异步确保)
### 五、消息事务
### 六、最大努力通知
### 七、总结
## 分布式Session `参考附录5`
### 一、基于客户端cookie存储
### 二、基于session绑定
### 三、基于session复制
### 四、基于session共享(重点redis)
1、基于Redis持久化session(重点)
2、基于memcached持久化session
3、基于数据库持久化session
## 分布式框架
### 第1章 常用的RPC框架 1
1.1 RPC框架原理 1
1.2 RMI介绍 2
1.2.1 原生RMI代码示例 3
1.2.2 RMI穿透防火墙 5
1.3 CXF/Axis2介绍 7
1.3.1 CXF介绍 7
1.3.2 Axis2介绍 14
1.4 Thrift介绍 21
1.4.1 Thrift工作原理介绍 23
1.4.2 Thrift IDL语法说明 26
1.4.3 基于Apache Thrift的Java版完整案例 28
1.4.4 基于Java注解的简化实现 36
1.5 gRPC介绍 42
1.5.1 protobuf3语法介绍 43
1.5.2 gRPC使用示例 45
1.6 HTTP Client介绍 53
1.6.1 构建HttpClient对象 54
1.6.2 构建URI对象 55
1.6.3 构建请求对象(HttpGet、HttpPost) 56
1.6.4 HttpClient发起调用及获取调用返回结果 56
1.7 实现自己的RPC框架 61
1.8 RPC框架与分布式服务框架的区别 68
1.9 本章小结 68
### 第2章 分布式服务框架总体架构与功能 69
2.1 面向服务的体系架构(SOA) 69
2.1.1 面向服务架构范式 69
2.1.2 服务拆分原则 71
2.2 分布式服务框架现实需求 72
2.3 分布式服务框架总体架构及所需的技术概述 72
2.4 本章小结 74
### 第3章 分布式服务框架序列化与反序列化实现 75
3.1 序列化原理及常用的序列化介绍 75
3.2 Java默认的序列化 77
3.3 XML序列化框架介绍 80
3.4 JSON序列化框架介绍 82
3.5 Hessian序列化框架介绍 87
3.6 protobuf序列化框架介绍 88
3.7 protostuff序列化框架介绍 93
3.8 Thrift序列化框架介绍 98
3.9 Avro序列化框架介绍 100
3.9.1 Avro介绍 100
3.9.2 Avro IDL语言介绍 101
3.9.3 Schema定义介绍 103
3.9.4 Maven配置及使用IDL与Schema自动生成代码 103
3.9.5 Avro序列化/反序列化实现 105
3.10 JBoss Marshalling序列化框架介绍 110
3.11 序列化框架的选型 112
3.12 实现自己的序列化工具引擎 113
3.13 本章小结 118
#### 第4章 实现分布式服务框架服务的发布与引入 119
4.1 Spring Framework框架概述 119
4.1.1 Spring Framework介绍 119
4.1.2 Spring Framework周边生态项目介绍 121
4.2 FactoryBean的秘密 122
4.2.1 FactoryBean的作用及使用场景 123
4.2.2 FactoryBean实现原理及示例说明 124
4.3 Spring框架对于已有RPC框架集成的支持 127
4.3.1 Spring支持集成RPC框架介绍 127
4.3.2 基于RmiProxyFactoryBean 实现RMI与Spring的集成 128
4.3.3 基于
HttpInvokerProxyFactoryBean实现HTTP Invoker与Spring的集成 131
4.3.4 基于HessianProxyFactoryBean实现Hessian与Spring的集成 133
4.4 实现自定义服务框架与Spring的集成 136
4.4.1 实现远程服务的发布 136
4.4.2 实现远程服务的引入 144
4.5 在Spring中定制自己的XML标签 150
4.6 本章小结 158
#### 第5章 分布式服务框架注册中心 159
5.1 服务注册中心介绍 159
5.2 ZooKeeper实现服务的注册中心原理 161
5.2.1 ZooKeeper介绍 161
5.2.2 部署ZooKeeper 161
5.2.3 ZkClient使用介绍 164
5.2.4 ZooKeeper实现服务注册中心 173
5.3 集成ZooKeeper实现自己的服务注册与发现 175
5.3.1 服务注册中心服务提供方 175
5.3.2 服务注册中心服务消费方 176
5.3.3 服务注册中心实现 178
5.4 本章小结 189
#### 第6章 分布式服务框架底层通信实现 190
6.1 Java I/O模型及I/O类库的进化 190
6.1.1 Linux下实现的I/O模型 190
6.1.2 Java语言实现的I/O模型 194
6.1.3 Java Classic I/O(Blocking I/O)介绍 194
6.1.4 Java Non-blocking I/O(NIO)介绍 211
6.1.5 NIO2及Asynchronous I/O介绍 233
6.2 Netty使用介绍 255
6.2.1 Netty开发入门 256
6.2.2 Netty粘包/半包问题解决 265
6.3 使用Netty构建服务框架底层通信 320
6.3.1 构建分布式服务框架Netty服务端 320
6.3.2 构建分布式服务框架服务调用端Netty客户端 330
6.4 本章小结 347
#### 第7章 分布式服务框架软负载实现 348
7.1 软负载的实现原理 348
7.2 负载均衡常用算法 349
7.2.1 软负载随机算法实现 349
7.2.2 软负载加权随机算法实现 350
7.2.3 软负载轮询算法实现 351
7.2.4 软负载加权轮询算法实现 352
7.2.5 软负载源地址hash算法实现 354
7.3 实现自己的软负载机制 355
7.4 软负载在分布式服务框架中的应用 357
7.5 本章小结 361
#### 第8章 分布式服务框架服务治理 362
8.1 服务治理介绍 362
8.2 服务治理的简单实现 364
8.2.1 服务分组路由实现 364
8.2.2 简单服务依赖关系分析实现 374
8.2.3 服务调用链路跟踪实现原理 380