面试场景设计大纲

高并发场景设计

1. 系统资源优化

1.1 磁盘读写优化
同步写
异步写
顺序写
随机写
缓存分块写入
一次性写入
写请求
写入策略
阻塞线程等待磁盘确认
高延迟
写入OS PageCache
后台线程刷盘
低延迟
连续扇区写入
吞吐量 500MB/s+
磁头寻道
吞吐量 < 1MB/s
4KB对齐写入
减少小IO
preallocate文件空间
避免碎片
  • 同步写:直接阻塞调用线程(如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优化
ThreadPool
+corePoolSize: int
+maxPoolSize: int
+workQueue: BlockingQueue
+rejectedExecutionHandler: RejectPolicy
LockFree
+Disruptor RingBuffer
+CAS(Compare And Swap)
Coroutine
+Goroutine(Golang)
+Virtual Threads(Java 21)
  • 线程池:避免线程频繁创建销毁(ThreadPoolExecutor核心参数:核心线程数、队列类型)。
  • 协程:轻量级线程(Go的Goroutine、Java Loom),支持百万级并发。
  • 绑定CPU核心:减少上下文切换(tasksetCPU Affinity)。

技术细节:

  • 线程池参数:corePoolSize=CPU核数,maxPoolSize=2*CPU核数
  • 无锁队列:Disruptor框架实现1,000万Ops/s
  • 协程调度:Go调度器实现百万级Goroutine
  • CPU亲和taskset -c 0,1 ./app绑定核心
1.3 内存管理
40%30%20%10%内存分配优化策略分布堆内内存 (JVM Heap)堆外内存 (DirectByteBuffer)内存池 (Object Pooling)mmap文件映射
  • 堆内内存(JVM Heap):
    • 关注GC优化(G1/ZGC低停顿收集器)。
  • 堆外内存(Off-Heap):
    • 减少GC压力(Netty的DirectByteBuffer、Redis的jemalloc)。
    • 用于网络缓冲、文件映射(mmap)。
  • 内存池化:复用内存对象(如Netty的ByteBuf池)。

技术细节:

  • 堆外内存:Netty的DirectByteBuffer减少GC暂停
  • 内存池:Apache Commons Pool对象复用
  • mmap:RocketMQ将1GB文件映射到内存
  • GC优化:ZGC最大暂停时间<1ms
1.4 网络优化
Client应用程序操作系统内核网卡传统写操作(4次拷贝)发送请求数据写入内核缓冲区拷贝到用户空间写入Socket缓冲区发送到网卡零拷贝操作(1次DMA传输)发送请求数据sendfile()系统调用直接DMA传输到网卡Client应用程序操作系统内核网卡
  • 同步 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 高并发架构全景
弹性扩展
无状态
分片
分库分表
自动扩缩
微服务集群
RedisCluster
分布式缓存
Sharding
DB读写分离
客户端
CDN
API网关
限流熔断
本地缓存
异步MQ
DB写库
主库
从库
配置中心
注册中心
监控系统
链路追踪
2.7 熔断限流机制
Closed
Open:
失败率
>
阈值
Open
HalfOpen:
冷却时间到
HalfOpen
测试请求失败
Closed:
测试请求成功
限流策略
TokenBucket[令牌桶]
TokenBucket
RateLimiter
SlidingWindow[滑动窗口]
SlidingWindow
Sentinel

技术细节:

  • 令牌桶算法:Guava RateLimiter实现QPS控制
  • 熔断恢复:Hystrix半开状态探测
  • 自适应限流:Sentinel根据系统负载动态调整
  • 集群限流:Redis实现分布式限流

3. 中间件技术

3.1 ES查询优化
  • 倒排索引:快速全文检索。
  • 优化技巧
    • 分片数 = 节点数 × 1.5(避免跨节点查询)。
    • 冷热分离:SSD存储热数据。
客户端
协调节点
数据节点1
数据节点2
分片1
副本1
分片2
副本2

技术细节:

  • 冷热分离:SSD存放热索引,HDD存放冷索引
  • 索引优化_source字段禁用,使用doc_values
  • 查询路由preference=_local优先本地分片
  • 分片策略:分片数=节点数×1.5
3.2 Redis高可用
  • 数据结构
    • String:缓存简单值
    • Hash:存储对象
    • ZSet:排行榜
  • 持久化:RDB(快照)+AOF(指令追加)。
  • 集群:Proxy模式(Codis) vs 去中心化(Redis Cluster)。
集群
Replica
Master
Replica
Sentinel
Sentinel
Sentinel
客户端
代理层

技术细节:

  • 集群模式:Redis Cluster自动分片(16384槽)
  • 持久化:RBD快照+AOF重写
  • 热点KeyCLUSTER HOTSPOT命令检测
  • 大Key拆分:Hash使用hscan分页
3.3 MQ消息可靠性
  • 可靠性
    • Kafka:ACK=all(所有副本确认)。
    • RocketMQ:事务消息(二阶段提交)。
  • 顺序性:单Partition内有序(如订单ID哈希到同一分区)。
生产者Broker消费者1. 发送半消息(Half Message)2. 返回PreCommit OK3. 执行本地事务4. Commit/Rollback5. 写入WAL(顺序写)6. 存储到CommitLog7. 推送消息8. 处理消息(业务逻辑)9. 发送ACK10. 标记已消费11. 发送NACK12. 重试队列alt[消费失败]生产者Broker消费者

技术细节:

  • 事务消息: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
    

核心设计原则

在这里插入图片描述
在这里插入图片描述

通过以上设计可实现:

  1. 单机性能:Nginx可达100万RPS,Redis 20万OPS
  2. 扩展能力:每增加节点提升线性吞吐
  3. 可用性:99.99% SLA(年停机<52分钟)
  4. 数据保障:RPO=0(零数据丢失),RTO<30秒

高并发设计核心原则总结

原则实现方式案例
减少阻塞异步IO、非阻塞调用Netty事件驱动
顺序优于随机日志追加写入、LSM-TreeKafka顺序写磁盘
池化复用连接池、线程池、内存池HikariCP数据库连接池
分而治之数据分片、读写分离Redis Cluster分片
异步解耦MQ消息队列、事件驱动订单创建后发MQ通知物流
监控兜底全链路追踪、实时告警Prometheus+Alertmanager

关键提示:高并发设计本质是用空间换时间、用复杂度换性能。需根据业务场景权衡一致性、可用性、延迟(CAP三角)。例如支付系统优先CP(强一致),而资讯feed流优先AP(高可用)。

分布式系统设计

核心设计原则

大型分布式系统设计原则
容错设计
水平扩展
松耦合
最终一致性
安全纵深防御
故障假设
冗余设计
自动恢复
无状态服务
数据分片
读写分离
异步通信
消息队列
服务网格
CAP权衡
补偿事务
对账机制
零信任架构
全链路加密
最小权限原则

关键原理与实现

1. 分布式共识算法
ClientLeaderFollower1Follower2写请求AppendEntriesAppendEntriesACKACK提交日志(多数确认)响应成功CommitIndexCommitIndexClientLeaderFollower1Follower2

核心算法

  • Paxos:第一个被证明正确的共识算法
  • Raft:易于理解的领导选举机制
  • ZAB:Zookeeper原子广播协议
  • Gossip:去中心化最终一致性协议
2. 数据分片与复制
DISTRIBUTED_SYSTEMstringsystem_nameintshard_countDATA_SHARDstringshard_keystringrange_startstringrange_endREPLICAstringroleprimary/replicadatetimelast_syncNODEstringipstringregioncontainshasresides_on

分片策略

  • 哈希分片:均匀分布,但无法范围查询
  • 范围分片:支持范围查询,可能热点问题
  • 地理位置分片:优化访问延迟

复制策略

  • 同步复制:强一致,高延迟
  • 异步复制:弱一致,低延迟
  • 半同步复制:平衡方案
3. 分布式事务实现
所有参与者确认
任意参与者拒绝
Preparing
Committed
Aborted
TCC
所有Try成功
任意Try失败
Try
Confirm
Cancel
Saga
成功
成功
失败
失败
Step1
Step2
Step3
Compensate1
Compensate2

事务模式对比

模式一致性性能复杂度适用场景
2PC强一致跨库事务
TCC最终一致高并发金融交易
Saga最终一致长业务流程
本地消息表最终一致异步通知场景
4. 弹性设计模式
弹性策略
状态监控
QPS控制
资源隔离
故障报告
熔断器
服务实例1
限流器
服务实例2
舱壁隔离
服务实例3
健康检查
令牌桶
线程池
客户端
负载均衡器

关键机制

  • 熔断器:Hystrix/Sentinel实现故障隔离
  • 限流器:令牌桶/漏桶算法控制流量
  • 舱壁隔离:资源分区避免级联故障
  • 健康检查:主动探测服务状态

系统架构全景

在这里插入图片描述

关键设计考量

1. CAP定理应用

在这里插入图片描述

场景选择

  • CP系统:金融交易、配置管理(etcd,Zookeeper)
  • AP系统:社交网络、内容分发(Cassandra,DynamoDB)
  • CA系统:单点数据库(MySQL,PostgreSQL)
2. 数据一致性模型
强一致性
线性一致性
顺序一致性
弱一致性
最终一致性
因果一致性
会话一致性

应用场景

  • 强一致:账户余额、库存扣减
  • 最终一致:用户动态、评论系统
  • 因果一致:消息时序、社交图谱

性能优化技术

分层缓存策略
回填机制
首次
未命中
未命中
写入缓存
数据库
广播失效
客户端
请求
服务端

缓存策略

  1. 客户端缓存:HTTP缓存控制
  2. 本地缓存:Caffeine/Guava
  3. 分布式缓存:Redis Cluster
  4. 数据库缓存:InnoDB Buffer Pool
大规模扩展实践
优化手段
优化
分片
单元化
代码优化
10K QPS
数据分片
100K QPS
单元化部署
500K QPS
1M+ QPS

扩展路径

  1. 垂直扩展:硬件升级(CPU/内存)
  2. 水平扩展:无状态服务复制
  3. 数据分片:按key分布负载
  4. 单元化部署:按用户分区自治

运维与监控体系

可观测性支柱
可观测性
指标监控
日志追踪
分布式追踪
Prometheus
ELK Stack
Jaeger
告警系统
日志分析
调用链分析
自动扩缩
故障诊断
性能优化

黄金信号

  1. 延迟:请求处理时间
  2. 流量:系统承载请求量
  3. 错误:请求失败率
  4. 饱和度:资源使用程度

设计原则总结

  1. 容错优于完美:假设故障必然发生,设计自动恢复机制
  2. 扩展胜于优化:优先水平扩展而非单点优化
  3. 异步解耦同步:消息队列解耦服务依赖
  4. 分区容忍优先:网络分区时保持系统可用
  5. 安全不可妥协:零信任架构贯穿全系统
  6. 数据驱动决策:监控指标指导系统演进

大型系统设计箴言
“设计分布式系统时,要像设计飞机一样考虑冗余——单个引擎故障不应导致坠毁,
而应能安全着陆。每个组件都应有备份计划,每个操作都应有回退路径。”
通过遵循这些原则,可构建支持亿级用户、99.999%可用性的分布式系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值