高并发
分层
好处
- 隔离关注点,让不同的层专注做不同的事情
- 提高复用性
- 更加容易做横向扩展 。但 业务逻辑中存在比较复杂的计算,导致cpu成为了性能瓶颈,可以把逻辑层的部分单独抽离出来部署,对逻辑层做扩展,这相比于对整体系统扩展付出的代价小得多。
不足
性能损失,多一跳的问题
代码复杂度增加
单一原则
迪米特原则
开闭原则
高性能
想要减少任务的响应时间,首先要看你的系统是 CPU 密集型 还是 IO 密集型 的,因为不同类型的系统性能优化方式不尽相同。
CPU 密集型系统
CPU 密集型系统中,需要处理大量的 CPU 运算,那么选用更高效的算法或者减少运算次数就是这类系统重要的优化手段。比方说,如果系统的主要任务是计算 Hash 值,那么这时选用更高性能的 Hash 算法就可以大大提升系统的性能。发现这类问题的主要方式,是通过一些 Profile 工具来找到消耗 CPU 时间最多的方法或者模块,比如 Linux 的 perf、eBPF 等。
IO密集型系统
IO 密集型系统指的是系统的大部分操作是在等待 IO 完成,这里 IO 指的是磁盘 IO 和网络 IO。我们熟知的系统大部分都属于 IO 密集型,比如数据库系统、缓存系统、Web 系统。这类系统的性能瓶颈可能出在系统内部,也可能是依赖的其他系统,而发现这类性能瓶颈的手段主要有两类。
第一类是 采用工具
Linux 的工具集很丰富,完全可以满足你的优化需要,比如网络协议栈、网卡、磁盘、文件系统、内存,等等。这些工具的用法很多,你可以在排查问题的过程中逐渐积累。除此之外呢,一些开发语言还有针对语言特性的分析工具,比如说 Java 语言就有其专属的内存分析工具。
另外一类手段就是可以通过 监控 来发现性能问题。
在监控中我们可以对任务的每一个步骤做分时的统计,从而找到任务的哪一步消耗了更多的时间。这一部分在演进篇中会有专门的介绍,这里就不再展开了。
那么找到了系统的瓶颈点,我们要如何优化呢?优化方案会随着问题的不同而不同。比方说,如果是数据库访问慢,那么就要看是不是有锁表的情况、是不是有全表扫描、索引加得是否合适、是否有 JOIN 操作、需不需要加缓存,等等;如果是网络的问题,就要看网络的参数是否有优化的空间,抓包来看是否有大量的超时重传,网卡是否有大量丢包等。
高可用
系统设计
- 故障转移
- 降级
- 限流
- 超时控制
系统运维
- 灰度发布
- 演练
可扩展性
它表示可以通过增加机器的方式,线性提高系统的处理能力,从而承担更高的流量和并发。
无状态的应用更加易于扩展。对于mysql这种存储服务是有状态的,会涉大量数据的迁移。
考虑的因素:
- 数据库
- 缓存
- 依赖的第三方
- 负载均衡
- 交换机带宽
cdn 使用CNAME
记录域名的映射关系