欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

API 速率限制设计:令牌桶 vs 漏桶在网关层的取舍

发表于:|最后更新:|分类:网络架构与安全|阅读:1332 次

令牌桶允许短时突发流量,适合面向用户的开放 API;漏桶以恒定速率放行,适合保护脆弱的下游存储。网关层通常组合使用以实现分层防护。

令牌桶算法

一、Redis + Lua 实现原子令牌桶

lua
-- KEYS[1]=bucket key, ARGV[1]=rate, ARGV[2]=capacity, ARGV[3]=now
local rate = tonumber(ARGV[1])
local cap = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
local data = redis.call("HMGET", KEYS[1], "tokens", "ts")
local tokens = tonumber(data[1]) or cap
local ts = tonumber(data[2]) or now

tokens = math.min(cap, tokens + (now - ts) * rate)
local allowed = 0
if tokens >= 1 then
    tokens = tokens - 1
    allowed = 1
end
redis.call("HMSET", KEYS[1], "tokens", tokens, "ts", now)
return allowed