note on architect design
高并发系统设计的三大目标:高性能、高可用、可扩展
第一个:高并发大流量: scale-out, cache, async 脱离了并发来谈性能是没有意义的. 吞吐量与并发呈倒数关系
高性能
-
增加系统的并行处理能力 性能测试中的拐点模型
-
减少单次任务响应时间 CPU 密集型系统, Profile 工具perf、eBPF IO 密集型系统指的是系统的大部分操作是在等待 IO 完成,这里 IO 指的是磁盘 IO 和网络 IO
第二个: 高可用性 可用性 MTBF 和 MTTR
系统设计: 要把发生故障作为一个重要的考虑点
-
failover(故障转移)、超时控制以及降级和限流 完全对等 的节点之间做 failover 针对不对等节点的 failover 机制会复杂很多 代码中控制如何检测主备机器是否故障,以及如何做主备切换 选主的结果需要在多个备份节点上达成一致,所以会使用某一种分布式一致性算法,比方说 Paxos,Raft
- 调用超时控制 依赖很多的组件和服务, 它们之间的调用最怕的就是延迟而非失败
- 降级 保证核心服务的稳定而牺牲非核心服务的做法
- 限流
系统运维
灰度发布、故障演练 两个方面来考虑如何提升系统的可用性 90% 的故障是发生在上线变更阶段的 故障演练和时下比较流行的“混沌工程”的思路如出一辙 外搭建一套和线上部署结构一模一样的线下系统
第三个:易扩展 它表示可以通过增加机器的方式来线性提高系统的处理能力,从而承担更高的流量和并发 堆机器的效果是最好是线性。 集群系统中,不同的系统分层上可能存在一些 「瓶颈点」,这些瓶颈点制约着系统的横线扩展能力 无状态的,就比较难以扩展 因为向存储集群中增加或者减少机器时,会涉及大量数据的迁移
高可扩展性的设计思路
拆分 是提升系统扩展性最重要的一个思路
存储拆分首先考虑的维度是业务维度
这时,我们就需要针对数据库做按照数据特征做水平的拆分。我们最好一次性增加足够的节点以避免频繁地扩容。 尽量不要使用事务, 需要使用二阶段提交,这个协调的成本会随着资源的扩展不断升高,最终达到无法承受的程度。
业务层的扩展性
三个维度考虑业务层的拆分方案,它们分别是:业务纬度 ,重要性纬度 和 请求来源纬度。