付同学的技术客栈/

热点和突发流量:真正难的是不均匀

所属专题 高并发海量数据系统架构 第 8 篇 / 共 11 篇 查看专题目录

活动系统最怕的,不一定是全站流量都高。

更麻烦的是一个商品突然爆了。

首页总 QPS 看起来还能接受,但某个商品详情页、某条库存记录、某个活动资格接口被集中访问。平均值很好看,局部资源已经被打穿。

热点和突发流量真正难的地方,是不均匀。

热点流量有时候来得很突然。

一个商品被推荐了,一个活动被转发了,一个接口被 App 首页反复刷新。平时看起来平均的流量,突然集中到一个 Key、一个页面、一个接口上。

监控上看,整体 QPS 可能还没到系统上限,但某个 Redis 分片、某台应用机器、某个数据库分区已经先扛不住了。

所以热点最麻烦的地方,不是流量大,而是它不均匀。平均值会骗人。

现场判断 热点问题最会伪装:全局指标还好看,局部资源已经被打穿。

只看平均 QPS,很容易错过那个真正冒烟的商品、用户、设备或 Key。

一、秒杀不是普通下单的放大版

秒杀和抢购最容易制造突发流量。

它看起来只是下单,但实际会同时考验入口限流、库存扣减、排队、异步处理、防重复提交、防刷、支付超时和失败补偿。

如果直接把所有请求放进正常下单链路,数据库和库存系统大概率会被打爆。

更稳的方式通常是:

前端限流
  -> 网关限流
  -> 资格校验
  -> 库存预扣或令牌
  -> MQ 排队
  -> 异步创建订单

秒杀的关键不是让所有请求都进入系统,而是尽早过滤掉不可能成功的请求。

热点处理 局部热点要先识别,再隔离,最后才谈扩容
识别热点 看 Top 商品、Top Key、Top 用户、Top 设备。
提前过滤 资格校验、限流、防刷,把无效请求挡在前面。
隔离资源 热点缓存、库存分桶、独立队列,别拖垮全局。
异步收尾 订单创建、报表统计、通知补偿慢慢处理。

热点流量不是平均摊开的水,而是会集中砸向某一个点。

二、热点商品和热点库存要拆开设计

热点商品详情一般是读多写少,可以用缓存、本地缓存、多副本缓存来承接。

热点库存不同。库存会变化,而且涉及超卖问题,不能只靠普通缓存解决。

常见做法包括库存预热、库存分桶、Redis 原子扣减、数据库最终校验、订单超时释放。

我会把商品信息和库存扣减拆开设计:商品信息偏读优化,库存链路重点保证正确性和幂等。

把两者混在一起,很容易既拖慢读,又搞乱写。

三、热点不一定来自商品

热点可能来自很多维度。

一个大客户、一个热门主播、一个异常账号、一台高频上报设备,都可能成为热点。

热点用户的问题通常是单用户维度请求过高,导致账户、订单、余额、权限等数据被频繁读写。热点设备的问题常见于物联网、制造业、监控系统,高频状态上报可能把某个设备维度的数据写爆。

这类问题要靠维度识别。

监控里不能只看全局 QPS,还要能看到 Top 用户、Top 商品、Top 设备、Top Key。

看不见热点,就谈不上治理。

四、突发报表也是一种重流量

还有一种热点来自后台。

比如运营临时查一个大范围报表,财务导出一年数据,管理后台做复杂筛选。请求量不一定高,但单次查询很重。

这类流量如果直接打在线库,可能影响正常交易。

更好的方式是异步导出、报表库、预聚合、限制查询范围、限制导出频率。很重的查询可以让用户提交任务,后台生成文件后再下载。

后台系统不是低风险系统。它只是访问人数少,但单次操作可能很重。

五、高峰期要削峰,也要分级

高峰期流量削峰,不只是加 MQ。

入口要限流,核心链路要优先,非核心功能要降级,后台任务要错峰,低优先级数据可以延迟处理。

比如活动开始前,提前预热缓存和库存;活动中,关闭非核心统计;活动后,再慢慢补齐报表和分析数据。

高峰期真正要保护的是核心业务闭环。只要下单、支付、库存这些链路稳住,评论数晚一点、排行榜慢一点,用户通常可以接受。

六、可以带走的判断清单

  • 不只看全局 QPS,要看 Top Key、Top 用户、Top 商品。
  • 商品详情和库存扣减要分开设计。
  • 秒杀要尽早过滤不可能成功的请求。
  • 后台报表也可能拖垮在线库。
  • 高峰期要区分核心链路和非核心链路。
  • 局部热点要隔离,不要让它拖垮全局。

高并发架构不是只看平均值。很多事故,都是平均值很好看,局部已经烧起来了。


本系列:

高并发海量数据系统架构 第 8 篇 / 共 11 篇
查看专题目录

留下一条评论

暂无评论