三高定义:高性能 ,高可用 ,高扩展
高性能 :高性能核心观点是不浪费性能,即最大可能性利用已有性能,去除无效运算。高性能通过高并发和低延时来保证。
高并发:
- 分库分表
- 系统拆分,即常用的微服务处理,将请求分散到不同的机器,将流程分到不同的模块处理,通常与分库分表一同使用,避免数据库成为性能瓶颈.
- 读写分离,与缓存基本类似,适用于读多写少,但是同样存在数据一致性的问题。
- 消息队列,将并行转为串行,然后利用多线程或微服务并行处理,将并发处理量控制在系统可承受范围内,保证系统的可用性。
- 限流,过滤无效请求,降低IO次数,降低数据库的无效处理。
低延时:
- 预计算,部分场景可以提前计算数据,将结果放入缓存。
- 缓存预热,提前将数据到本地缓存或者分布式缓存中。
- JVM优化,包括新生代和老年代的大小、GC算法的选择等,尽可能减少GC频率和耗时。
- 锁选择,读多写少的场景用乐观锁,或者通过分段锁的方式减少锁冲突,尽量不要使用排他锁,在特殊情况下,可以借助排他锁实现特殊的熔断机制
- 索引优化,以及借助搜索引擎解决复杂查询问题
高可用:高可用有四个核心点:
- 集群:包括业务集群和数据集群,保证服务宕机之后有其他集群可以处理业务,保存数据。
- 监控 :监控是极为重要的预防手段之一,目的是在服务发生问题之前提现处理可能出现的问题,预防服务宕机。
- 告警响应 :告警同监控,也是预防手段之一,目的是在服务超出预警阈值之后,抢出处理时间,来解决问题或者保存数据。
- 容灾:容灾通常由集群和数据备份来处理,目的是降低突然出现问题而没有时间解决或保存数据造成的损害。
高扩展:拆分是提升系统扩展性最重要的一个思路,它会把庞杂的系统拆分成独立的,有单一职责的模块。相对于大系统来说,考虑一个一个小模块的扩展性当然会简单一些。将复杂的问题简单化,这就是我们的思路
- 合理的分层架构:比如上面谈到的互联网最常见的分层架构,另外还能进一步按照数据访问层、业务逻辑层对微服务做更细粒度的分层(但是需要评估性能,会存在网络多一跳的情况)。
- 存储层的拆分:按照业务维度做垂直拆分、按照数据特征维度进一步做水平拆分(分库分表)。
- 业务层的拆分:最常见的是按照业务维度拆(比如电商场景的商品服务、订单服务等),也可以按照核心接口和非核心接口拆,还可以按照请求源拆(比如ToC和To
B,APP和H5 )