Java 高并发思路

此文记录了自己学习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(分布式锁)
  • 监控报警机制