一、系统设计基础
1、分布式系统关键特性
(1)可扩展性-水平&垂直,扩展设计
(2)可靠性-错误可恢复,容错设计
(3)可用性-提供正常服务,冗余设计
(4)性能:一定时间内处理数据量,响应时间,吞吐量
(5)可维护性:系统修复或维护的难度
2、关键组件
(1)负载均衡
提升性能(增加并发),可用性(冗余),可扩展(水平扩展),负载均衡算法(最少连接,ip hash,轮询)
(2)缓存
更快的获取数据(临时热点数据),cdn
缓存更新策略:
Write-through: 先更新数据库,再更新缓存,性能最差,一致性最好
Write-around:写:先更新数据库,再失效缓存;读:如果缓存存在则返回,否则从数据库读取并更新缓存,可能导致cache miss,缓存击穿
Write-back:先写缓存,再写数据库,性能最好,一致性最差
缓存问题:(限流降级)
穿透:数据库缓存都不存在(校验,存空置,布隆)
击穿:缓存不存在(布隆,热点不过期)
雪崩:大批量缓存不存在(分散,随机过期时间)
bigkey:拆key,客户端合并
缓存淘汰策略
(3)分库分表
水平:按某个字段划分
垂直:按服务划分库,按业务划分表
分库分表算法:list,range,hash
(4)分区分桶
先分区再分桶,分区物理位置,分桶最小物理单元
(6)索引
提升读性能,降低写性能
(7)代理
正向(客户端代理),反向(服务的代理)
(8)冗余和副本
避免单点故障
(9)sql vs nosql
sql:关系型,acid,结构化数据
nosql:key-value,文档,列,图,大数据量,分布式,非结构化
(10)cap理论
zk(cp 不一致不可用),nacos(ap 最终一致)
(11)一致性hash
(12)长轮询,websocket,event