分布式系统概念
分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。分布式服务指的是将系统中的不同功能模块部署在多个服务器节点上,通过网络进行通信与协作,实现整体系统的功能目标。
为什么需要分布式服务?
单体架构的瓶颈
- 单点故障:一旦挂了,整个系统不可用
- 性能受限:横向扩展难,所有逻辑都挤在一台机器上
- 迭代慢:一个小变更也要重启整个服务
- 依赖混乱:代码耦合重,维护成本高
分布式架构的优势
- 横向扩展(通过增加节点扩容)
- 解耦各模块,提高开发效率
- 提高系统稳定性与可维护性
- 支持异构语言、技术栈开发
分布式与集群的区别
- 集群:多个人在一起做同样的事情
- 分布式:多个人在一起做不同的事情
核心组成
- 服务提供者(Provider):实现业务逻辑,对外提供服务
- 服务消费者(Consumer):调用远程服务,获取所需数据
- 注册中心(Registry):存储服务地址,实现服务发现与订阅
- 配置中心(Config Center):存储统一配置,便于动态下发更新
- 网关/反向代理:实现统一入口、安全认证、限流等
- 监控/链路追踪:追踪服务调用链,排查瓶颈与异常
常见模式
微服务架构(Microservices)
- 每个服务职责单一,独立部署、扩容
- 通信方式:HTTP REST、gRPC、消息队列
SOA(面向服务架构)
- 比微服务更”重”,强调企业服务总线(ESB)
- 通信方式多采用 SOAP/Web Service
通信方式对比
- RESTful API:基于 HTTP,易开发,广泛使用
- gRPC(基于 HTTP/2 + Protobuf):高性能、强类型
- 消息队列(如 Kafka/RabbitMQ):异步解耦、削峰填谷
- Thrift / Dubbo / Hessian:高性能 RPC 框架
分布式系统面临的问题
通信异常
网络本身的不可靠性,因此每次网络通信都会伴随着网络不可用的风险。另外,即使分布式系统各节点之间的网络通信能够正常执行,其延时也会大于单机操作。
-
网络基础设施的脆弱性
- 物理层故障:光纤断裂、交换机故障等
- 路由异常:BGP路由泄露等
- DNS故障
-
网络延迟问题
- 跨数据中心通信受光速限制
- 网络拥塞导致排队延迟
- TCP/TLS 握手带来的固定延迟
-
量化对比
- 单机内存访问:约 100ns
- 同机房网络延迟:约 0.5-2ms
- 跨地域延迟:如北京-上海约 30ms,中美约 150ms
网络分区(Network Partition)
网络分区是指分布式系统中由于网络故障导致节点之间无法正常通信的情况。
基本特征
- 网络隔离性:不同分区间完全失去网络连接
- 分区内部正常:每个分区内的节点仍能相互通信
- 多分区共存:通常会形成两个或多个独立运行的子网络
节点故障
节点故障是分布式系统中最常见的问题之一,指的是组成分布式系统的服务器节点出现的宕机或僵死现象。
节点故障的表现形式包括:
- 硬件故障:内存损坏、磁盘故障、电源问题
- 软件故障:操作系统崩溃、应用程序死锁
- 网络问题:节点与集群其他成员失去网络连接
三态
分布式系统每一次请求与响应存在特有的三态概念,即成功、失败和超时!
状态定义
- 成功(Success):请求被完整接收并处理,响应也成功返回给请求方
- 失败(Failure):请求被接收但处理过程中出现错误,系统明确返回了错误响应
- 超时(Timeout):在规定时间内未收到任何响应,系统无法确定请求的最终状态
超时状态的成因分析
- 请求丢失型超时:由于网络原因,该请求并没有被成功发送到接收方
- 响应丢失型超时:该请求成功被接收方接收并处理,但在响应反馈过程中出现丢失
常见解决方案
- 重试机制(带退避策略)
- 事务日志和状态追踪
- 最终一致性设计
- 两阶段提交协议