给接口加限流,响应头里有什么?固定窗口和滑动窗口有什么区别?多 worker 部署时 memory 存储还有效吗?在代理后面按 IP 限流为什么会误伤?这篇用真实的 gunicorn 与自己起的 redis 逐项验证。
7 次请求的状态码: [200, 200, 200, 200, 200, 429, 429]
第 1 次响应的限流头: {'x-ratelimit-limit': '5', 'x-ratelimit-remaining': '4', 'x-ratelimit-reset': '1790913508', 'retry-after': '60'}
第 7 次(429)响应的头: {'x-ratelimit-limit': '5', 'x-ratelimit-remaining': '0', 'x-ratelimit-reset': '1790913508', 'retry-after': '60'}
429 的正文(自定义 errorhandler): {"detail":"5 per 1 minute","error":"rate limited"}
别的客户端(X-Client: c2)不受影响: [200, 200, 200]上一篇:Flask-Caching;下一篇:Flask-Mail。
"3 per 10 seconds; 100 per hour" 连发 5 次: [200, 200, 200, 429, 429]
共享桶 "4 per minute":交替请求 /s1 与 /s2 共 6 次: [200, 200, 200, 200, 429, 429]
cost=5 的 "10 per minute":连发 3 次: [200, 200, 429]
@limiter.exempt 的路由连发 30 次是否都 200: True
只有默认限制的 /ping,头里: {'x-ratelimit-limit': '1000', 'x-ratelimit-remaining': '998', 'x-ratelimit-reset': '1790913509'}fixed-window t=0 发 1 次,t=1.5 s 连发 3 次,t=2.2 s 再连发 3 次:[200, 200, 200, 429, 200, 200, 200](限制 "3 per 2 seconds") moving-window t=0 发 1 次,t=1.5 s 连发 3 次,t=2.2 s 再连发 3 次:[200, 200, 200, 429, 200, 429, 429](限制 "3 per 2 seconds")
memory://(3 个 worker) 同一个客户端连发 30 次,限制 "5 per minute":放行 14 次 redis://127.0.0.1:9651(3 个 worker) 同一个客户端连发 30 次,限制 "5 per minute":放行 5 次 redis 里的键: ['LIMITS:LIMITER/rk/five/5/1/minute'] 某个限流键的值 = b'2' | TTL = 60
redis 是自己在非默认端口起的临时实例,验证完就关闭了。
不同 X-Forwarded-For 的 7 个请求(本篇的 key_func 回退到 get_remote_address)状态码: [200, 200, 200, 200, 200, 429, 429] (没有配置 ProxyFix 时 remote_addr 是直连方,所以上面全算同一个客户端——见第 135 篇)
无限流 69 µs/请求;有限流(memory) 116 µs/请求;多出 47 µs