系统设计
分布式
1 | https://github.com/Xten-no-brain/RaftKV |
CAP 定理
- 一致性(Consistency):所有节点在同一时间的数据完全一致
- 可用性(Availability):每个请求都能得到响应(不保证数据最新)
- 分区容忍性(Partition Tolerance):系统能容忍网络分区故障
三者不可兼得,最多满足两项
因为分布式系统中,网络分区是不可避免的,故只有两种系统
- CP:强一致性、容错,但不一定总可用
- AP:高可用、容错,但可能短时间不一致
如何选取?
BASE 理论
对 CAP 中 AP 场景的扩展
基本可以:系统故障时仍能提供部分功能
软状态:允许中间状态存在
最终一致性:数据经过一段时间后达成一致
一致性模型
- 强一致性
- 线性一致性
- 因果一致性
- 会话一致性
- 最终一致性
如何选取?
分布式事务
- 两阶段提交(2PC)
- 三阶段提交(3PC)
- TCC 模型
- SAGA 模型
如何选取?
副本同步
- 主从复制(同步 / 异步 / 半同步)
- Quorum 机制
- Raft / Paxos 简介
如何选取?
服务发现
- 静态配置
- 动态注册与发现(Consul / Etcd / Zookeeper)
如何选取?
全局分布式 ID
- UUID
- Redis 生成 ID
- 雪花算法
- Leaf(美团开源)
如何选取?
负载均衡
- 轮询
- 加权轮询
- 一致性哈希
- 随机
- IP Hash
- 基于连接数 / RTT 动态调整
如何选取?
幂等性
- 设计方法
- 唯一流水号
- 幂等表
- 业务逻辑保障
典型场景
数据一致性
- 强一致性
- 最终一致性
- 事件驱动架构
- 消息队列一致性保障
如何选取?
分布式锁
- 基于数据库
- 基于 Redis
- 基于 Zookeeper
- 可重入 / 非可重入
- 防止死锁设计
如何选取?
消息队列
- Kafka / RabbitMQ / RocketMQ / Pulsar
- 消息一致性保障
- 消息幂等性设计
- 消息顺序性设计
如何选取?
高可用设计
- Leader 选举
- 多活架构 vs 主备架构
- 灾备策略
如何选取?
扩展性设计
- 横向扩展
- 无中心设计 vs 有中心设计
- 分区与分片策略
缓存机制
- 本地缓存 vs 分布式缓存
- 缓存一致性策略
- Cache Aside
- Write Through
- Write Behind
- 缓存雪崩 / 穿透 / 击穿
如何选取?
限流机制
- 固定窗口
- 滑动窗口
- 漏桶算法
- 令牌桶算法
如何选取?
熔断 / 降级 / 容错
- 熔断器(Hystrix / Sentinel)
- 超时控制
- 自动恢复机制
如何选取?
案例
短链生成系统
分布式 ID 生成器
高并发秒杀系统
分布式文件存储系统
分布式锁实践
消息队列实践
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Xten's Blog!