分布式系统的设计哲学:架构模式全面介绍与选型策略
分布式
Distributed Systems / 分布式架构
1. 基本概念
- 分布式系统:多个独立的计算实体(进程/节点/服务)通过网络协作完成任务。没有单一的全局共享内存或全局时钟
- 特征:
- 节点并发执行
- 网络通信(延迟、丢包、分区)
- 部分失败(节点或网络中部分失败而不是全部失败)
- 可扩展性(水平扩展)
- 复杂性(并发一致性、协调、监控更难)
2. 核心难点
- 网络分区和CAP定理:
- CAP:Consistency(一致性)/Availability(可用性)/Partition tolerance(分区容忍性)三选两(实际:网络分区不可避免,所以系统设计中常在一致性和可用性间权衡)。
- 一致性模型
- 强一致性(每次读到的都是最新写)
- 最终一致性(写后最终会被所有节点看到)
- 线性化、顺序一致性、因果一致性等(逐步放松强一致性以换取性能与可用性)
- 分布式事务与补偿(事务一致性)
- 两段式提交(2PC):强一致但阻塞,扩展性差
- Saga模式:把事务拆成一系列局部事务+补偿动作,适用与微服务的最终一致性
- 故障处理
- 重试与幂等(保证重试不会重复副作用)
- 超时和断路器(避免级联失败)
- 指数退避
- 数据分片与复制
- 分片(Sharding)用于扩展写/存储
- 副本用于提升可用性和读吞吐(主从、主主)
- 一致性协议(Paxos/Raft)用于分布式一致性与laeder选举
- 时序与一致性问题
- 没有全局时钟:用逻辑时钟(Lamport)或物理时钟 + 容错策略
- 监控与可观测性
- 日志/指标/分布式追踪(Trace)是必须的:便于定位跨服务调用链问题
3. 常用组件 / 技术栈(概念层面)
-
通信协议:HTTP/REST, gRPC(Protobuf), AMQP/Kafka(消息队列)
-
服务治理:服务注册与发现(Eureka/Consul)、配置中心(Nacos/Config Server)
-
负载均衡:硬件 LB / 软件 LB / DNS / client-side lb
-
弹性设计:断路器(Resilience4j)、限流、熔断、降级、重试
-
数据层:主从复制、分片、分布式事务(2PC/SAGA)
-
Observability:Prometheus + Grafana、OpenTelemetry/Zipkin/Jaeger
4. 常见设计模式与实践
幂等性:PUT/DELETE 等请求设计为幂等,或通过幂等 key(idempotencyKey)保证一次性写入。
缓存策略:Cache Aside(应用主动读缓存/缺失时回 DB)、Write-Through、Write-Behind。注意缓存一致性/失效。
异步化 & 消息化:用消息队列(Rabbit/Kafka)解耦、缓冲,削峰填谷,异步重试。
服务拆分:微服务 → 单职能服务,按业务边界划分;要考虑跨服务事务问题。
数据复制与备份:冷备/热备、备份策略、灾难恢复(RPO/RTO)
ID 生成:UUID、数据库自增、Snowflake(分布式时间戳+序列)——权衡有序性、冲突、查询效率
5. 分布式主要用在哪些方面
- 分布式存储
- 数据太大,一台机器的磁盘放不下,就进行分片(sharding)存到多台机器
- 举例:HDFS、MongoDB分片、MySQL分库分表
- 分布式计算
- 计算量太大,一台机器算不完,就拆分成任务分给不同机器同时算
- 举例:MapReduce、Spark
- 分布式消息 / 事件
- 系统之间靠消息来通信,消息可能要跨很多节点传递
- 举例:Kafka、RabbitMQ
- 分布式协调
- 多个节点要达成一致(谁是主节点、数据版本是不是一样)
- 举例:Zookeeper、Etcd、Raft协议
- 分布式事务
- 多台机器一起完成一笔事务(比如支付系统:扣钱、库存、订单必须一起成功 / 失败)
- 技术:2PC、Saga、TCC
- 分布式服务治理
- 微服务架构下,成百上千个服务怎么互相发现、调用、负载均衡
- 举例:Eureka、Nacos、Consl
6. 其他模式
- 单体式(Monolithic):
- 传统做法:整个应用(前端、后端、数据库)都打包在一起运行
- 好处:简单、开发快
- 坏处:大了以后难以扩展,改一点地方可能全系影响
- 集中式(Centralized):
- 一切逻辑、数据都在一台中心机上,其他只是终端
- 举例:早期的大型机 / 银行核心机房
- 和分布式的区别是:集群更强调“多台机器做一样的事”,分布式更强调“不同机器分工协作”
- 微服务式(Microservices)
- 把应用拆成很多小服务,每一个服务独立部署、运行,通过API / 消息通信
- 微服务往往跑早分布式环境里
- 对等式(2P2,Peer-to-Peer)
- 没有中心,大家都是“平等节点”
- 举例:BT下载、区块链