知识卡片
限流状态必须外置到共享存储
内容
[[令牌桶算法允许突发不允许持续超额]]本质上需要一份状态——记录”这个用户这一秒已经用掉几个请求名额”,如果把这份状态存在应用实例自己的内存里,一旦应用有多个副本,限流的效果就会悄悄失真:每个副本只看得到打到自己身上的那部分请求,用户实际能突破的总请求数变成了”单实例限额 × 副本数”,而不是原本设想的全局限额。解法是把这份状态外置到 Redis 这类所有副本都能访问的共享存储里,所有副本读写的是同一份计数,限流才能真正按”全局”而不是”按实例”生效。发散:这是[[部署流水线三阶段的时间预算]]系列卡片里反复出现的主题——只要一个应用被要求保持无状态、可以水平扩展,任何”看起来只是临时存一下”的状态都不能偷偷放回应用内存,必须显式想清楚这份状态该由哪个外部数据服务来兜底,限流计数器、会话数据、幂等键,本质上都是同一类问题。
参考来源
《Cloud Native Spring in Action》第9章《API gateway and circuit breakers》