百万QPS架构设计:从垂直扩展到水平分片
🏗️ 垂直扩展的物理极限
单机性能天花板
public class VerticalScalingLimit {
double scalability = 1 / (1 + (n/α)^β)
}
典型瓶颈分析
组件 |
瓶颈表现 |
突破方案 |
数据库 |
连接池溢出 |
读写分离+连接复用 |
缓存 |
内存碎片化 |
分布式缓存+冷热分离 |
服务实例 |
CPU Throttling |
协程调度+JIT优化 |
✂️ 水平分片的十二种剑法
分片策略对比
public class ConsistentHash {
private SortedMap<Integer, Node> ring = new TreeMap<>();
public void addNode(Node node) {
IntStream.range(0, VIRTUAL_NODES)
.forEach(i -> ring.put(hash(node.ip + "#" + i), node));
}
public Node getShard(String key) {
int hash = hash(key);
SortedMap<Integer, Node> tailMap = ring.tailMap(hash);
return tailMap.isEmpty() ? ring.firstEntry