知识卡片

库存接口被恶意刷:用短TTL缓存和URL重写应对可容忍轻微延迟的高频访问

普通读书笔记卡

内容

商品详情页的库存接口曾遭遇恶意刷量,每分钟访问量超过600万,导致Tomcat应用机器只能靠定时重启来维持可用——这类问题的根源不是接口本身逻辑有缺陷,而是访问量远超正常业务预期。解决思路的关键判断是:库存这类展示型数据,即使缓存几秒钟也是业务上完全可以接受的,不需要每次请求都强一致地查询最新库存,于是开启Nginx Proxy Cache对这个接口做短TTL缓存,访问量瞬间降到正常水平——本质上是用几秒钟的数据新鲜度,换取了绝大部分重复请求根本不需要打到后端应用的效果。与此同时,团队还结合了一个针对”攻击者常见手法”的补充优化:恶意刷量的请求经常会在URL里附加各种随机参数(试图绕过基于完整URL做key的缓存),团队在Nginx层做了URL重写,把请求参数重新拼装和验证成规范化的形式,再配合一致性哈希做负载均衡,这样无论攻击方在URL里加多少随机数,重写后落到缓存的key都是一致的,不会因为参数随机化而绕过缓存、造成”看似有缓存实际上大量请求全部穿透”的假象——这个优化额外带来了10%以上的缓存命中率提升。这个案例给出了一条应对恶意高频访问的实用组合拳:先判断这类数据能不能容忍短暂的过期(如果能,短TTL缓存几乎是成本最低的防护手段),再针对性地堵住”用URL参数随机化绕过缓存”这类常见的绕过手法(用URL规范化/重写统一缓存key),两者需要配合使用,只做短TTL缓存而不处理URL随机化,防护效果会大打折扣。

参考来源

- 位置:《高可用架构(第1卷)》第3章《电商架构热点专题》"3.1 亿级商品详情页架构演进技术解密"节,"3.1.3 遇到的一些问题和解决方案"(源文件:_epub-src/OEBPS/Text/Chapter3_1_4.xhtml) - 结论依据:原文说明"因为是详情页展示的数据,缓存几秒钟是可以接受的,因此开启Nginx Proxy cache来解决该问题,开启后降到正常水平……通过URL重写+一致性哈希负载均衡,不怕随机URL,一些服务提升了10%+的缓存命中率",直接支撑本卡片结论。 - 原始内容:商品详情页库存接口曾在2014年被恶意刷,每分钟超过600万访问量……因为是详情页展示的数据,缓存几秒钟是可以接受的,因此开启Nginx Proxy cache来解决该问题,开启后降到正常水平……通过URL重写+一致性哈希负载均衡,不怕随机URL,一些服务提升了10%+的缓存命中率。