SystemDesign | 秒杀系统

@toc:

  • 高性能:静动分离/热点优化/系统优化;
  • 高可用:削峰/兜底, 库存数据一致性;
  • 一致性;

➤ 高性能:

  • 静动分离: 数据拆分, 数据缓存, 数据整合;
  • 热点优化:
    • 热点识别: 通过链路各节点收集热点key, 识别热点商品, 发送到各订阅模块, 各模块采取各自措施(缓存或限流或熔断)
    • 热点隔离:
      • 系统隔离(怎么做?): 负载均衡层做(热点key如何更新到配置?) 或者端上存储特定cookie,
      • 数据隔离: 热点数据使用单独的Cache/DB
    • 热点优化: 系统层(业务代码)对热点做优化, 本机缓存/ 限流等
  • 系统优化(代码):
    • 减少序列化(多在RPC阶段)
    • 字符串优化: 涉及到字符串的IO, OutputStream() 类函数从而减少数据的编码转换 (由于字符串每个字符需要转字节, 这个过程需要查编码表)
    • 去除不必要组件: 去掉MVC (因为MVC的 Chain)
    • 剪裁异常日志堆栈大小

➤ 一致性: 库存数据的一致性

  • 减库存
    • 在业务层面, 何时减库存? 两种方案 1下单 , 2支付 (两种方案优劣?) 在实际中使用 下单减库存, 下单后有支付超时, 超时后释放库存
    • 如何防止库存为负: 1事务,发现数据为负则回滚, 2数据库字段设置为unsigned, 3 是使用 CASE WHEN 判断语句
  • 一致性的性能优化
    • 读性能: 读链路上可以做”不影响性能”的校验, 一般不在读链路上做一致性校验, 只在写链路做一致性校验
    • 写性能: 1数据库选型(如果不需要事务,或者复杂的减扣逻辑, 可以换内存型KV数据库), 2排队减扣(例如分布式锁) 3专用数据库

➤ 高可用:

  • 流量削峰:
    • 客户端通过校验等手段, 减少请求
    • 服务端通过 限流 or 消息队列(如何解决积压?)
  • Plan B: 兜底

@ref 从0到1设计一个秒杀系统