@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设计一个秒杀系统