一. 分布式系统可解决的问题
1. 解决稳定性可用性问题。
2. 解决单机处理能力差问题。
二. 分布式系统的发展历程
1. 单体结构
所有代码在一个系统中,所有模块在一个应用中。一个数据库,一个文件系统,一个应用系统。
优势:事务简单,不存在远程调用问题,不存在网络问题,适合微型系统。
问题: 一个模块有issue可能导致整个系统都不可用,可用性差,数据库压力大,性能差。
2. 垂直结构
将系统按照业务模块分进行垂直拆分成多个系统,每个垂直子系统为一个单体结构。
优势:数据库压力得到缓解,性能得到提升。
问题:数据库表的join受到限制,存储过程实现逻辑受到限制,会有很多重复代码。
3. 分布式结构
将可复用的业务水平拆分开当做公用服务,并下层作为低层服务。
优势:抽象部分逻辑减少代码量。
问题:系统更加复杂。
4. 微服务架构
将公共的服务集合成一个系统。
三. 分布式系统成本
分布式事务问题,在多个系统中如何实现事务一致性。
不允许服务有状态,服务有多个实例运行在不同的服务器中,这些多个实例的内部是不能有中间状态的。
服务的依赖关系变得复杂,调用关系非常复杂,定位问题变得复杂,维护成本变高。
分布式会话,需要一个session管理所有的会话,不能让用户在一台机器上登录了,其他机器上没有session信息。
分布式job,定时任务不能在每台机器上都出发,应该用主从架构,只让master机器run job,master挂了选举一个master出来。
四. 单体架构升级到分布式架构的可能遇到的问题
1. 新功能和旧系统维护的问题
新需求在新旧版本都开发成本高,旧bug fix在新系统中也需要fix成本高。
2. 业务完整性问题
migration 时候不知道某些功能是否有用,导致部分功能缺失。
3. 团队协作方式改变
不同的调用层,是按照功能分配任务,还是按照接口层分配。其中的交流沟通成本。
4. 系统交付式转变
五. 如何选择分布式架构
分布式架构的核心问题RPC-远程调用。
远程调用的方式:
协议
描述
优点
缺点
RMI
JAVA 远程方法调用、使用原生二进制方式进行序列化
简单易用、SDK支持,提高开发效率
不支持跨语言
Web Service
比较早系统调用解决方案 ,跨语言, 其基于WSDL 生成 SOAP 进行消息的传递。
SDK支持、跨语言
实现较重,发布繁琐
Http
采用http +json 实现
简单、轻量、跨语言
不支持SDK
Hessian
采用http +hessian序列化实现
简单,轻量、sdk支持
不能跨语言
RMI- 是rpc的一个实现方式,可以实现一个jvm到另一个jvm的方法调用,他的实现依赖jvm。
缺点:不支持跨语言,在分布中没有负载均衡。
RMI 实例:
Server:
RMI Registry:
Client:
轻量级分布式架构, Http + Nginx
问题: 靠nginx负载均衡,中间多一次io,不能自动服务发现。
嵌入应用内部的去中心化架构
基于独立代理进程的架构
模式
优点
缺点
适应场景
案例
集中式负载架构
简单
集中式治理
与语言无关
配置维护成本高
多了一层IO
单点问题
大部分公司都适用,对运维有要求
亿贝、携程、早期互联网公司
客户端嵌入式架构
无单点
性能更好
客户端复杂
语言栈要求
中大规模公司、语言栈统一
Dubbo 、
Twitter finagle、
Spring Cloud Ribbon
独立进程代理架构
无单点
性能更好
与语言无关
运维部署复杂
开发联调复杂
中大规模公司
对运维有要求
Smart Stack
Service Mesh
一个好的分布式架构可以解决以下问题:
- 注册中心服务发现
- 远程调用
- sdk
- 负载均衡
- 容错机制
- 跨语言
- 性能