第十一部分:高并发实战案例 —— 秒杀系统设计
将前面各部分知识点综合运用,设计一个高并发秒杀系统。
11.1 需求
商品库存有限,例如 100 件。
瞬时洪峰流量(例如 10 万人同时抢购)。
要求不超卖,不重复下单,系统不崩溃。
11.2 核心思路
流量层层削峰:
页面静态化 + CDN。
客户端随机延时发起请求(防集中冲击)。
API 网关限流(令牌桶)。
库存预热与扣减:
秒杀开始前将库存加载到 Redis 中。
使用 Redis 的 DECR 原子操作扣减库存,扣减成功才进入后续流程。
请求排队异步化:
扣减成功后,将下单请求写入消息队列,立即返回“排队中”。
后端 worker 串行或小并发消费队列创建订单,避免数据库死锁。
订单防重:
用户 ID + 商品 ID 作为唯一键,保证同一用户只能秒杀一次。
兜底降级:
若 Redis 或 MQ 压力过大,直接返回“活动火爆,请重试”。
11.3 伪代码实现
@RestController
public class SeckillController {
@Autowired
private RedisTemplate redis;
@Autowired
private RocketMQTemplate mq;
@PostMapping("/seckill")
public String seckill(Long userId, Long productId) {
// 1. 限流(使用 Sentinel)
// 2. 校验是否已秒杀过(Redis Set)
Boolean already = redis.opsForSet().isMember("seckill:user:"+productId, userId);
if (Boolean.TRUE.equals(already)) {
return "您已参与过该活动";
}
// 3. 原子扣减库存
Long stock = redis.opsForValue().decrement("seckill:stock:"+productId);
if (stock == null || stock < 0) {
// 库存不足,恢复库存(decrement 后为负,需加回)
redis.opsForValue().increment("seckill:stock:"+productId);
return "已抢光";
}
// 4. 记录用户参与(避免重复扣减)
redis.opsForSet().add("seckill:user:"+productId, userId);
// 5. 发送消息异步创建订单
SeckillOrderMsg msg = new SeckillOrderMsg(userId, productId);
mq.syncSend("seckill_order_topic", msg);
return "排队中,请稍后查询结果";
}
}
@RocketMQMessageListener(topic = "seckill_order_topic", consumerGroup = "order-group")
public class OrderConsumer implements RocketMQListener<SeckillOrderMsg> {
@Autowired
private OrderService orderService;
@Override
public void onMessage(SeckillOrderMsg msg) {
// 幂等:使用唯一键约束(userId+productId)
orderService.createSeckillOrder(msg.getUserId(), msg.getProductId());
}
}
11.4 数据库设计
CREATE TABLE `seckill_order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL,
`product_id` bigint NOT NULL,
`status` tinyint DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_product` (`user_id`,`product_id`) -- 防重
);
第十二部分:高并发系统的可观测性 —— 监控、追踪、日志
分布式系统出了故障,如何快速定位?需要构建可观测性(Observability)三大支柱:指标(Metrics)、链路追踪(Tracing)、日志(Logging)。
12.1 指标监控(Prometheus + Grafana)
每个微服务暴露 /metrics 端点,Prometheus 定期拉取,存储时序数据,Grafana 可视化。
常用指标:QPS、延迟(P99)、错误率、CPU/内存/GC、线程池活跃数、MQ 积压量。
12.2 分布式链路追踪(SkyWalking、Jaeger)
通过为每个请求生成全局唯一的 Trace ID,记录调用链(Span)。可以查看请求经过哪些服务、耗时多久、在哪一步失败。
Spring Cloud Sleuth 集成示例:
spring:
zipkin:
base-url: http://zipkin:9411
sleuth:
sampler:
probability: 1.0 # 采样率
在日志中自动注入 Trace ID,方便聚合查询。
12.3 日志收集(ELK Stack)
Filebeat 采集日志 → Logstash 过滤 → Elasticsearch 存储 → Kibana 搜索分析。
告警:基于 Prometheus Alertmanager 或 Kibana 的 Watcher,当错误率飙升或队列积压超过阈值时发送钉钉/邮件。
来源:
https://yvyus.cn/