《企业级中台设计》
时间:2023-05-06
作者:周文喆
公司有新活动,需承载高达 10w+人同时抢购 的并发流量。而现有系统仅支持约 200 TPS,难以满足需求。因此需要设计并实现一个中台系统,用于分发请求、削峰填谷、库存一致性控制等,确保活动期间系统稳定运行。
项目目标
- 支撑高并发 NFT 抢购场景,稳定处理 10 万人在线请求
- 防止库存超卖、请求重复、热点数据集中等常见并发问题
- 提供秒杀限流、幂等控制、库存一致性保障的完整链路
- 降低对底层服务的压力,增强系统可扩展性
技术方案
压力测试与系统扩容
- 使用 阿里云 PTS 进行压力测试,识别瓶颈
- 扩容策略:
- 增加
Pod
数量 - 增加
Gateway
实例 - 增加服务器资源
- 增加
- 利用监控平台观察 CPU、内存、QPS、TPS 等指标动态调整资源
限流与降级处理
- 使用 Redis 令牌桶算法 限制请求频率
- 当 Redis 库存不可用:
- 使用分布式锁 +
singleflight
查询 MySQL 并回填 Redis
- 使用分布式锁 +
- 异常情况下快速失败,保证主业务稳定
库存防超卖机制
- 采用 Lua 脚本 在 Redis 内部原子扣减库存,避免并发超卖
- 活动高峰结束后,使用 分布式锁 对库存进行统一校正(矫正库存)
幂等消费控制
- 使用 Redis 布隆过滤器 防止重复请求
- 数据库层通过唯一索引兜底,防止重复写入
热点 Key 优化
- Redis 使用 集群部署
- 将库存键值通过 hashtag 哈希分片分配到不同 Slot,降低访问冲突
大表性能优化
- 藏品表基于 合约地址分表
- 唯一键:
合约地址 + tokenId
- 使用
BLOB
类型作为 Bitmap,记录二值状态(如是否已售) - 合约地址作为唯一索引,批量更新减少乐观锁回滚
分布式事务处理
- 定时任务(Cron)扫描数据库,补偿失败的 Kafka 消息
- Kafka:
- 通过哈希分配 Partition 保证消息顺序消费
- 使用
Consumer Group
隔离不同业务逻辑
- 幂等性保障:
- 使用幂等索引 + 状态字段,避免重复消费写入