高并发
纵向扩展
加配置。提高单机的硬件性能,增加内存和CPU,磁盘升级SSD。
横向扩展
加机器。解决单机性能瓶颈。
缓存
- 本地缓存
1.考虑强软弱虚引用的使用 2.考虑jvm垃圾回收影响 3.考虑缓存过期和击穿的问题 4. ehcache和guava
- 分布式缓存
1.考虑缓存穿透(cache和db都没有数据),缓存击穿(缓存没有db有)和缓存雪崩(大量缓存同时失效)2. 缓存穿透-缓存短期空对象,缓存击穿-分布式锁,缓存雪崩-随机过期时间
- 集中式缓存
- CPU缓存
- 操作系统缓存
- HTTP缓存
- 数据库缓存
- 缓存一致性
- 缓存命中率
- 热点key
- 缓存更新模式
Cache Aside模式;Read/Write Through模式;Write Behind Caching(Write Back)模式。参考: 缓存更新模式
异步
- 分布式消息队列
- 本地消息队列
- 线程异步回调
- NIO/AIO
高性能
增加并行计算能力
- 加机器,加配置
- 线程池
- http连接池
- 多路复用
- 锁降级
- 并行I/O
减小单次任务响应时间
- 缓存
- 时间复杂度
- 池化
- 锁降级
- 线程预热
- 长连接
- 预先处理
- 延后处理
高可用
故障转移
- 对等节点
所有节点承担读写,且节点内部无状态。节点失败,无影响。
- 非对等节点
基于分布式选举算法进行协同作业的主从备节点集群;基于分布式一致性算法进行存储的节点集群。"心跳检测机制"触发选举操作。(比如redis的哨兵模式或者集群模式、MySQL的主从切换等)
超时控制
不限制的让请求持续等待或占用资源,会导致流量挤压,引起雪崩似的超时。所以超时控制是一种"舍小家为大家"策略,体现的是牺牲少量请求,保证系统整体可用性的智慧。常用措施:同步自定义超时打断机制,异步wait/notify机制和利用future和countdonwlatch等关键字。
流量控制
超时控制是在请求处理阶段采取的截断措施,而流量控制则是在请求进入阶段根据系统负载利用qps指标进行拦截的措施。常用算法:漏桶算法和令牌桶算法。
- 漏桶算法
以固定速率从桶中流出水滴,以任意速率往桶中放入水滴,桶容量大小是不会发生改变的。因为桶中的容量是固定的,如果流入水滴的速率>流出的水滴速率,桶中的水滴可能会溢出。那么溢出的水滴请求都是拒绝访问的,或者直接调用服务降级方法。前提是同一时刻。
- 令牌桶算法
按照特定的速率生成令牌,以此控制流量速度。如果没有从令牌桶中获取到 token ,拒绝访问。
降级管理
降级是为了保证核心服务稳定而牺牲边缘服务的做法,是一种"舍卒保车"策略。
熔断机制
熔断机制是一种快速失败的实现方案,在下游服务故障时利用快速失败机制降低对整体系统性能的影响。
重试机制
重试是一种保障业务运行的容错补偿机制。包含:同步有限次重试,异步跑批重试。
幂等
幂等是支持重试机制的重要手段。常用措施:全局唯一id,锁(悲观锁乐观锁)
灰度发布
能支持按机器维度进行小流量部署,观察系统日志和业务指标,等运行平稳后再推全量。
监控报警
全方位的监控体系,包括最基础的CPU、内存、磁盘、网络的监控,以及Web服务器、JVM、数据库、各类中间件的监控和业务指标的监控。