本文总结面对高并发场景可以采用的解决方案,文章只是介绍整体相关概念,其中每一项都可以利用多种不同中间件或者框架来实现,可以根据需要选择某几个进行更加深入的学习和理解。
1. 扩容
- 垂直扩容(纵向扩展):提高系统部件能力
- 水平扩容(横向扩展):增加更多系统成员来实现
(1) 数据库扩容:
- 读多写少--读操作扩展:使用memcache、redis、CDN等缓存
- 读少写多--写操作扩展:使用Cassandra、Hbase等
2. 缓存
(1) 缓存特征概念:
- 命中率:命中数/(命中数+没有命中数)
- 最大元素(空间)
- 清空策略:FIFO、LFU、LRU、过期时间、随机等
(2) 缓存命中率影响因素:
- 业务场景和业务需求
- 缓存的设计(粒度和策略)
- 缓存容量和基础设施
(3) 缓存分类和应用场景:
- 本地缓存:编程实现(成员变量、局部变量、静态变量)、Guava Cache
- 分布式缓存:Memcache、Redis
(4) 高并发场景下缓存常见问题:
- 缓存一致性
- 缓存并发问题
- 缓存穿透问题
- 缓存的雪崩现象
3. 消息队列
(1) 消息队列特性
- 业务无关:只做消息分发
- FIFO:先投递先到达
- 容灾:节点的动态增删和消息的持久化
- 性能:吞吐量提升,系统内部通信效率提高
(2) 消息队列使用原因:生产和消费的速度或稳定性等因素不一致
(3) 消息队列好处:
- 业务解耦
- 最终一致性
- 广播
- 错峰与流控
4. 应用拆分
(1) 应用拆分的原则
- 业务优先
- 循序渐进
- 兼顾技术:重构、分层
- 可靠测试
(2) 应用拆分时的思考
- 应用之间通信机制:RPC(dubbo等)、消息队列
- 应用之间数据库设计:每个应用都有独立的数据库
- 避免事务操作跨应用
5. 应用限流
(1) 应用限流的算法
- 计数器法
- 华东窗口
- 漏桶算法
- 令牌桶算法
6. 服务降级和服务熔断
(1) 服务降级的分类
- 自动降级:超时、失败次数、故障、限流
- 人工降级:秒杀、双11大促等
(2) 服务降级与服务熔断的比较
- 共性:目的、最终表现、粒度、自治
- 区别:触发原因、管理目标层次、实现方式
(3) 服务降级要考虑的问题
- 核心服务、非核心服务
- 是否支持降级,降级策略
- 业务放通场景,策略
7. 数据库切库分库分表
8. 高可用手段
- 分布式任务调度:elastic+zookeeper,schedulerx
- 服务器主备切换:apache curator+zookeeper分布式锁实现
- 监控报警机制
- 阿里的中间件:tddl,diamond,精卫,txc,opensearch等