高并发场景设计
1. 系统资源优化
1.1 磁盘读写优化
- 同步写:直接阻塞调用线程(如
fsync),避免在高并发场景使用。 - 异步写:通过缓冲区+后台线程刷盘(如Kafka的页缓存),核心原则。
- 顺序写:磁头无需寻道(如日志追加、WAL),性能是随机写的10倍以上。
- 随机写:需优化为顺序写(如LSM-Tree合并SSTable)。
- 缓存分块写入:合并小IO为批量大IO(如Kafka的
pagecache批量刷盘)。 - 一次性写入:避免多次修改(如对象存储上传文件)。
技术细节:
- 异步写:Kafka使用
PageCache+sendfile实现600MB/s+吞吐 - 顺序写:LSM-Tree将随机写转为顺序写(LevelDB/RocksDB)
- 缓存分块:HDFS默认128MB块大小,减少元数据开销
- O_DIRECT:MySQL InnoDB绕过PageCache直接写磁盘
1.2 CPU优化
- 线程池:避免线程频繁创建销毁(
ThreadPoolExecutor核心参数:核心线程数、队列类型)。 - 协程:轻量级线程(Go的Goroutine、Java Loom),支持百万级并发。
- 绑定CPU核心:减少上下文切换(
taskset或CPU Affinity)。
技术细节:
- 线程池参数:corePoolSize=CPU核数,maxPoolSize=2*CPU核数
- 无锁队列:Disruptor框架实现1,000万Ops/s
- 协程调度:Go调度器实现百万级Goroutine
- CPU亲和:
taskset -c 0,1 ./app绑定核心
1.3 内存管理
- 堆内内存(JVM Heap):
- 关注GC优化(G1/ZGC低停顿收集器)。
- 堆外内存(Off-Heap):
- 减少GC压力(Netty的
DirectByteBuffer、Redis的jemalloc)。 - 用于网络缓冲、文件映射(
mmap)。
- 减少GC压力(Netty的
- 内存池化:复用内存对象(如Netty的
ByteBuf池)。
技术细节:
- 堆外内存:Netty的
DirectByteBuffer减少GC暂停 - 内存池:Apache Commons Pool对象复用
- mmap:RocketMQ将1GB文件映射到内存
- GC优化:ZGC最大暂停时间<1ms
1.4 网络优化
- 同步 vs 异步:NIO(如Netty)实现非阻塞IO,Reactor模式。
- 分块写入:将大包拆为小包(如TCP滑动窗口控制)。
- 零拷贝:
sendfile(Linux)、FileChannel.transferTo(Java),减少内核态拷贝。
技术细节:
- 零拷贝:Java NIO的
FileChannel.transferTo() - Epoll:Linux边缘触发模式支持百万连接
- TCP_NODELAY:禁用Nagle算法减少延迟
- SO_REUSEPORT:Linux 3.9+实现端口复用
2. 系统架构设计
2.1 读写分离
- 写主库+读从库(MySQL主从),风险:主从延迟需业务容忍。
2.2 分布式
- 数据分片:按Hash/Range分片(如Redis Cluster、Elasticsearch Sharding)。
- 服务拆分:微服务按业务边界拆分(DDD领域驱动)。
2.3 微服务
- 独立部署:故障隔离,弹性伸缩。
- 通信优化:gRPC(Protobuf编码)替代RESTful。
2.4 数据缓存
- 多级缓存:本地缓存(Caffeine)+分布式缓存(Redis)。
- 缓存策略:
- 穿透:布隆过滤器+空值缓存。
- 雪崩:随机过期时间+熔断降级。
2.5 数据一致性
- 最终一致性:MQ异步同步(如Binlog+Canal同步到ES)。
- 强一致性:Raft/Paxos协议(如Etcd、ZooKeeper)。
2.6 异步流程
- 消息队列:解耦服务(Kafka/RocketMQ),削峰填谷。
- 事件驱动:Domain Events(如Axon框架)。
2.7 限流熔断
- 限流算法:令牌桶(Guava RateLimiter)、漏桶。
- 熔断器:Hystrix/Sentinel(开→半开→闭状态机)。
2.8 无状态扩容
- Session外置:Redis存储用户状态。
- 服务发现:Consul/Nacos动态扩缩容。
2.9 资源池化
- 数据库连接池:HikariCP(快)、Druid(监控全)。
- 线程池:动态调整参数(如动态
corePoolSize)。
2.10 全链路监控
- Trace追踪:OpenTelemetry+Jaeger。
- 指标收集:Prometheus+Grafana看板。
2.1-2.10 高并发架构全景
2.7 熔断限流机制
技术细节:
- 令牌桶算法:Guava RateLimiter实现QPS控制
- 熔断恢复:Hystrix半开状态探测
- 自适应限流:Sentinel根据系统负载动态调整
- 集群限流:Redis实现分布式限流
3. 中间件技术
3.1 ES查询优化
- 倒排索引:快速全文检索。
- 优化技巧:
- 分片数 = 节点数 × 1.5(避免跨节点查询)。
- 冷热分离:SSD存储热数据。
技术细节:
- 冷热分离:SSD存放热索引,HDD存放冷索引
- 索引优化:
_source字段禁用,使用doc_values - 查询路由:
preference=_local优先本地分片 - 分片策略:分片数=节点数×1.5
3.2 Redis高可用
- 数据结构:
- String:缓存简单值
- Hash:存储对象
- ZSet:排行榜
- 持久化:RDB(快照)+AOF(指令追加)。
- 集群:Proxy模式(Codis) vs 去中心化(Redis Cluster)。
技术细节:
- 集群模式:Redis Cluster自动分片(16384槽)
- 持久化:RBD快照+AOF重写
- 热点Key:
CLUSTER HOTSPOT命令检测 - 大Key拆分:Hash使用
hscan分页
3.3 MQ消息可靠性
- 可靠性:
- Kafka:ACK=all(所有副本确认)。
- RocketMQ:事务消息(二阶段提交)。
- 顺序性:单Partition内有序(如订单ID哈希到同一分区)。
技术细节:
- 事务消息:RocketMQ二阶段提交
- 消息回溯:Kafka支持offset重置
- 批量发送:Producer缓冲批量提交
- 死信队列:处理失败消息
3.4 DB高并发落库
- 分库分表:ShardingSphere/MyCAT。
- 批量写入:
INSERT ... ON DUPLICATE KEY UPDATE替代单条写入。 - 索引优化:覆盖索引、避免隐式类型转换。
技术细节:
- 分库分表:ShardingSphere分片策略
- 批量写入:
INSERT INTO ... ON DUPLICATE KEY UPDATE - 索引优化:覆盖索引+索引下推
- 连接池:HikariCP配置:
minimumIdle: 10 maximumPoolSize: 100 connectionTimeout: 3000
核心设计原则


通过以上设计可实现:
- 单机性能:Nginx可达100万RPS,Redis 20万OPS
- 扩展能力:每增加节点提升线性吞吐
- 可用性:99.99% SLA(年停机<52分钟)
- 数据保障:RPO=0(零数据丢失),RTO<30秒
高并发设计核心原则总结
| 原则 | 实现方式 | 案例 |
|---|---|---|
| 减少阻塞 | 异步IO、非阻塞调用 | Netty事件驱动 |
| 顺序优于随机 | 日志追加写入、LSM-Tree | Kafka顺序写磁盘 |
| 池化复用 | 连接池、线程池、内存池 | HikariCP数据库连接池 |
| 分而治之 | 数据分片、读写分离 | Redis Cluster分片 |
| 异步解耦 | MQ消息队列、事件驱动 | 订单创建后发MQ通知物流 |
| 监控兜底 | 全链路追踪、实时告警 | Prometheus+Alertmanager |
关键提示:高并发设计本质是用空间换时间、用复杂度换性能。需根据业务场景权衡一致性、可用性、延迟(CAP三角)。例如支付系统优先CP(强一致),而资讯feed流优先AP(高可用)。
分布式系统设计
核心设计原则
关键原理与实现
1. 分布式共识算法
核心算法:
- Paxos:第一个被证明正确的共识算法
- Raft:易于理解的领导选举机制
- ZAB:Zookeeper原子广播协议
- Gossip:去中心化最终一致性协议
2. 数据分片与复制
分片策略:
- 哈希分片:均匀分布,但无法范围查询
- 范围分片:支持范围查询,可能热点问题
- 地理位置分片:优化访问延迟
复制策略:
- 同步复制:强一致,高延迟
- 异步复制:弱一致,低延迟
- 半同步复制:平衡方案
3. 分布式事务实现
事务模式对比:
| 模式 | 一致性 | 性能 | 复杂度 | 适用场景 |
|---|---|---|---|---|
| 2PC | 强一致 | 低 | 低 | 跨库事务 |
| TCC | 最终一致 | 中 | 高 | 高并发金融交易 |
| Saga | 最终一致 | 高 | 中 | 长业务流程 |
| 本地消息表 | 最终一致 | 中 | 中 | 异步通知场景 |
4. 弹性设计模式
关键机制:
- 熔断器:Hystrix/Sentinel实现故障隔离
- 限流器:令牌桶/漏桶算法控制流量
- 舱壁隔离:资源分区避免级联故障
- 健康检查:主动探测服务状态
系统架构全景

关键设计考量
1. CAP定理应用

场景选择:
- CP系统:金融交易、配置管理(etcd,Zookeeper)
- AP系统:社交网络、内容分发(Cassandra,DynamoDB)
- CA系统:单点数据库(MySQL,PostgreSQL)
2. 数据一致性模型
应用场景:
- 强一致:账户余额、库存扣减
- 最终一致:用户动态、评论系统
- 因果一致:消息时序、社交图谱
性能优化技术
分层缓存策略
缓存策略:
- 客户端缓存:HTTP缓存控制
- 本地缓存:Caffeine/Guava
- 分布式缓存:Redis Cluster
- 数据库缓存:InnoDB Buffer Pool
大规模扩展实践
扩展路径:
- 垂直扩展:硬件升级(CPU/内存)
- 水平扩展:无状态服务复制
- 数据分片:按key分布负载
- 单元化部署:按用户分区自治
运维与监控体系
可观测性支柱
黄金信号:
- 延迟:请求处理时间
- 流量:系统承载请求量
- 错误:请求失败率
- 饱和度:资源使用程度
设计原则总结
- 容错优于完美:假设故障必然发生,设计自动恢复机制
- 扩展胜于优化:优先水平扩展而非单点优化
- 异步解耦同步:消息队列解耦服务依赖
- 分区容忍优先:网络分区时保持系统可用
- 安全不可妥协:零信任架构贯穿全系统
- 数据驱动决策:监控指标指导系统演进
大型系统设计箴言:
“设计分布式系统时,要像设计飞机一样考虑冗余——单个引擎故障不应导致坠毁,
而应能安全着陆。每个组件都应有备份计划,每个操作都应有回退路径。”
通过遵循这些原则,可构建支持亿级用户、99.999%可用性的分布式系统。
1515

被折叠的 条评论
为什么被折叠?



