Java 高并发思路
此文记录了自己学习Java 高并发思路的基础知识,纪念自己面试前的准备。
扩容
垂直扩容(纵向扩容):提高系统部件能力
水平扩展(横向扩容):增加更多系统成员
读操作扩展
memcache、redis、CDN
写操作扩展
Cassandra、Hbase等
缓存
缓存的特征
- 命中率:命中数/(命中数+没有命中数)
- 最大元素(空间)
- 清空策略:FIFO(先进先出)、LFU(最少使用)、LRU(最近使用时间)、过期时间
缓存命中率的影响因素
- 业务场景、业务需求
- 缓存的设计(粒度、策略)
- 缓存的容量和基础设施
缓存的分类和应用场景
- 本地缓存:编程实现(无法共享)Guava Cache
- 分布式缓存:Memcache、Redis
Redis缓存
缓存一致性
缓存并发
缓存穿透
缓存雪崩
消息队列
消息队列的特性
- 业务无关:只做消息分发
- FIFO:先投递先到达
- 容灾:节点的动态增删和消息的持久化
- 性能:吞吐量提升,系统内部通信效率提高
为什么需要消息队列
- 生产个消费的速度或稳定性等因素不一致
消息队列的好处
- 业务解耦
- 最终一致性
- 广播
- 错峰与流控
消息队列 Kafka
应用拆分
应用拆分的原则
- 业务优先
- 循序渐进(拆分、测试)
- 兼顾技术(重构、分层)
- 可靠测试
应用拆分落地实现-微服务
应用限流
限流算法
- 计数器法
- 滑动窗口
- 漏桶算法 Leaky Bucket
- 令牌桶算法 Token Bucket
服务降级、服务熔断
服务降级
如果服务处理不了了,就返回一个默认值
- 自动降级:超时、故障
降级 VS 熔断
- 共性:目的相同、最终表现一致
- 区别:触发原因不同、实现方式不同
Hystrix
数据库切库、分库、分表
数据库瓶颈
- 单个库数据量太大:多个库
- 单个库服务器压力大,读写瓶颈:多个库
- 单个表数据量过大:分表
高可用技术手段
- 任务调度系统分布式:elastic-job + zookeeper
- 主备切换:apache curator + zookeeper(分布式锁)
- 监控报警机制