{T}

高性能架构 学习笔记(第 3 部分)

3.2 经验数据估算

用户量与并发量关系

javascript
// 用户量与并发量的经验公式
const userToConcurrency = {
  // 第一步:总用户数 → 在线用户数
  totalToOnline: {
    ratio: '10:1',
    example: '1000万总用户 → 100万在线用户'
  },
  
  // 第二步:在线用户数 → 峰值 QPS
  onlineToQPS: {
    ratio: '10:1',
    example: '100万在线用户 → 10万峰值 QPS'
  },
  
  // 第三步:峰值 QPS → 峰值 TPS
  qpsToTPS: {
    ratio: '约 5:1 到 10:1',
    example: '10万峰值 QPS → 1-2万峰值 TPS'
  }
}
 
// 完整计算示例
function calculateSystemCapacity(totalUsers) {
  // 在线用户数(约 10%)
  const onlineUsers = totalUsers * 0.1
  
  // 峰值 QPS(约在线用户的 10%)
  const peakQPS = onlineUsers * 0.1
  
  // 峰值 TPS(约为 QPS 的 1/5 到 1/10)
  const peakTPS = peakQPS / 5
  
  return {
    totalUsers,
    onlineUsers,
    peakQPS,
    peakTPS
  }
}
 
// 示例:1000万用户的系统
const capacity = calculateSystemCapacity(10000000)
console.log(capacity)
/*
{
  totalUsers: 10000000,
  onlineUsers: 1000000,    // 100万在线
  peakQPS: 100000,          // 10万 QPS
  peakTPS: 20000            // 2万 TPS
}
*/

3.3 并发量计算实战

3.3.1 场景一:电商系统

javascript
// 电商系统并发量计算
const ecommerceScenario = {
  // 业务数据
  business: {
    totalUsers: 10000000,           // 1000万注册用户
    dailyActiveUsers: 1000000,      // 100万日活
    peakOnlineUsers: 500000         // 50万峰值在线
  },
  
  // 性能数据
  performance: {
    averageResponseTime: 0.2,       // 平均响应时间 200ms
    peakQPS: 50000,                 // 峰值 QPS 5万
    peakTPS: 5000                   // 峰值 TPS 5000
  },
  
  // 并发量计算
  calculation: {
    formula: '并发量 = QPS × 平均响应时间',
    process: `
      1. 峰值 QPS = 50,000
      2. 平均响应时间 = 0.2 秒
      3. 并发量 = 50,000 × 0.2 = 10,000
      
      结论:系统需要同时处理 10,000 个并发请求
    `
  }
}

3.3.2 场景二:秒杀系统

javascript
// 秒杀系统并发量计算
const seckillScenario = {
  // 业务场景
  scenario: {
    event: 'iPhone 15 限时秒杀',
    inventory: 1000,               // 库存 1000 台
    expectedParticipants: 100000   // 预计 10 万人参与
  },
  
  // 流量特征
  traffic: {
    peakTime: '秒杀开始前后 1 分钟',
    peakQPS: 500000,               // 峰值 QPS 50万
    averageResponseTime: 0.1       // 平均响应 100ms
  },
  
  // 并发量计算
  calculation: {
    concurrentRequests: 500000 * 0.1,  // 50,000 并发
    challenge: '5万并发请求抢 1000 台手机'
  },
  
  // 优化策略
  optimization: [
    '请求队列 + 限流',
    'Redis 预扣库存',
    '异步处理订单',
    'CDN 静态化'
  ]
}

四、TPS 与 QPS 等价场景

4.1 等价条件

TPS ≈ QPS 的场景

  • 一次事务只包含一次查询
  • 用户操作对应单一接口请求

示例

javascript
// 场景:用户查询个人信息
 
// 单一接口请求
GET /api/user/profile
 
// 单一数据库查询
SELECT * FROM users WHERE id = ?
 
// 此时:TPS ≈ QPS ≈ RPS

4.2 不等价场景

TPS < QPS 的场景

  • 一次事务包含多个查询
  • 复杂业务流程

示例

javascript
// 场景:用户下单
 
// TPS = 1(一次下单事务)
Transaction: 下单
 
// QPS = 5+(多次查询)
Queries: [
  'SELECT 商品信息',
  'SELECT 库存',
  'SELECT 用户余额',
  'SELECT 收货地址',
  'SELECT 优惠券'
]
 
// 此时:TPS << QPS

五、性能指标监控实战

5.1 监控系统架构

plaintext
性能监控系统架构:
 
┌─────────────────────────────────┐
│         应用服务                 │
│    ↓ 发送指标数据               │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│      数据收集层                 │
│  Prometheus / StatsD            │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│      数据存储层                 │
│  InfluxDB / TimescaleDB         │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│      可视化展示                 │
│  Grafana / Kibana              │
└─────────────────────────────────┘