一.脑图
?二.笔记
- 一.大规模服务化架构
- 1.分布式系统的架构演变过程
- 垂直拆分业务子系统
- 根据系统业务功能的不同拆分多个业务模块,由不同的业务团队负责承建,分而治之,独立部署。
- 以大型电商网站为例,拆分为首页、用户、搜索、广告、购物、订单、商品、收益结算等子系统
- 注意把控拆分系统等粒度,如果拆分过细,会导致维护成本过高
- 作用
- 业务垂直化改造可以防止一些非核心模块的问题导致核心模块出现问题
- 服务化架构演进
- 前提
- 进行服务化改造的前提条件: 用户规模逐渐扩大,多元化的业务出现,技术人员扩充导致多人维护一个模块时,就可以进行服务化的改造,否则都不太适合
- API网关服务
- 职责
- 统一负责处理公共逻辑
- 比如:鉴权、流控、日志记录、安全防护、负载均衡、灰度发布
- 灰度发布
- 通过一系列的规则和策略,先将一小部分的用户作为“金丝雀”,让其请求路由到新版本应用上进行观察,待运行正常后,再逐步导流更多的用户到灰度环境中
- 网关层的引入并非必须,但是业务越复杂,网关的好处就会越明显
- 分布式多活数据中心架构演进
- 主中心负责核心业务的正常流转,其他数据中心负责数据备份及承担一些边缘业务
- 假设主数据中心发生重大灾难,灾备数据中心可以接管,减少对用户的影响
- 2.服务治理需求
- RPC调用
- 本质上是让服务提供方和服务调用方都能够以一种极其简单的方式来实现服务的发布和调用,使开发人员只需要关注自身的业务逻辑
- 分布式事务
- 最终一致性
- 一般采用最终一致性,避免过多占用资源,增加系统复杂度
- 注册中心性能瓶颈方案
- 改造方案
- 阶段二
- 减少注册中心的配置,只写入关键信息,其他配置信息写入元数据中心,实现数据分离
- Dubbo 2.7.0版本 支持精简注册配置项和元数据服务等功能
- 3.服务治理之调用链
- 分布式调用跟踪系统其实就是一个监控平台,能够以可视化的方式展现跟踪到的每一个请求的完整调用链,以及采集调用链上每个服务的执行耗时、整合孤立日志等。
- 论文
- Dapper, a Large-Scale Distributed Systems Tracing Infrastructure
- 实现方案
- 基于Dubbo filter + SkyWalking + es
- 二.全链路压测
- 三.流控方案
- 限流方案
- 静态化
- 通过CDN缓存静态化数据,避免请求直接访问数据中心
- 限流
- 限流算法
- 计数器算法
- 计数器负责计数,与阈值进行比较,当等于阈值时,便触发限流逻辑,达到时间临界点时,才重置计数器,处理新的请求
- 应用层限流方案
- 基于Sentinel进行扩展
- 将Sentinel控制台的监控功能集成进Grafana
- 消息队列
- ActivieMQ、Kafka、RocketMQ、RabbitMQ
- Kafka、RocketMQ为互联网场景下拥有高并发、大流量的分布式系统而设计
- 四.读/写优化方案
- 五.分库分表方案
- 关系型数据库架构演变
- 数据库读写分离
- master存在TPS较高的情况,master与slave之间存在数据同步延迟
- 在写入master之前,将同一份数据落在缓存中,避免高并发情况下,从slave中获取不到指定数据的情况发生
- 垂直分库
- 企业根据自身业务的垂直划分,将原本冗余在单库中的数据表拆分到不同的业务库中,实现分而治之的数据管理和读/写操作
- 当单表数据量超过500万行时,读操作就逐渐成为瓶颈,即使创建索引也无法解决数据膨胀带来的检索效率低下等问题
- 数据库的卸任操作不会因为数据膨胀而成为瓶颈,但是读操作会存在上限
- 水平分库与水平分表
- 水平分表
- 将原本冗余在单库中的单个业务表拆分为n个“逻辑相关”的业务子表
- 不同业务的子表各自负责存储不同区间的数据,对外形成一个整体,这就是Sharding操作
- 水平分库
- 将水平分表后的业务子表按照某种特定的算法和规则分散到n个“逻辑相关”的业务子库中
- 需要专门的Sharding中间件负责数据的路由工作
- 作用
- 解决高并发场景下单库的性能瓶劲,并充分利用分布式的威力提升数据库的读/写性能
- 关注
- 无法继续使用Mysql提供的Auto_Increment生成全局唯一和连续性ID
|