Usando + pitón redis-lua limitar implementar la interfaz

Actualmente en el mercado hay un gran número de máquinas en funcionamiento. Cada día millones de peticiones al servidor de allí, prácticamente consume ancho de banda y recursos informáticos. Puede filtrar parte de la solicitud de ciertas estrategias para garantizar la estabilidad del servidor.

Más información:

1. Por supuesto, esta capa puede ser lógicamente caer la capa de acceso, la capa de negocio también puede caer. Aquí fin de no afectar a otros servicios en línea, para garantizar la estabilidad del sistema y códigos de trazabilidad. Además de facilitar la aplicación de la verificación mínimo, lo dejé en la capa de negocio.

2. El limitador de flujo de varios algoritmos, por ejemplo: un contador, de cubetas de fichas, cubo. El contador se utiliza, es relativamente simple.

algoritmo contador está dentro de un cierto período de tiempo, el número de solicitudes de acceso incrementa. Bote todas las solicitudes excede el límite superior.

1. En primer lugar crear lua guión (ratelimit.lua)

local key = KEYS[1] local limit = tonumber(ARGV[1]) local expire_time = ARGV[2] local current = tonumber(redis.call('get', key) or "0") if current > 0 then if current + 1 > limit then return 0 else redis.call("INCR", key) return 1 end else redis.call("SET", key, 1) redis.call("EXPIRE", key, expire_time) return 1 end

 

2. Obtener resumen del script lua

redis-cli script load "$(cat ratelimit.lua)"
"123456789b24c879d926f3a38cb21a3fd9062e55"

3. Definir decorador

# 异步限流策略 2个/10秒
# key_str: 部门:项目:路由:ID  例: a:b:Test:ratelimit:1234
# 装饰器这里的参数都是根据Lua定义的参数来配置的
# sha1: 就是redis-cli script load "$(cat ratelimit.lua)"的返回值
# 1: 表示key的个数 # limit: 限制次数 # expire: key过期时间 def async_ratelimit(key_str, limit=2, expire=10, sha1="123456789b24c879d926f3a38cb21a3fd9062e55"): def decorator(func): async def wrap(*args, **kw): self = args[0] key = key_str % (self.__class__.__name__, func.__name__, self.get_argument('id')) raw = redis.evalsha(sha1, 1, key, limit, expire) if raw == 0: return self.send_json(errcode=10001, errmsg='接口请求频率过高') else: await func(*args, **kw) return wrap return decorator

 

Ejemplos

@async_ratelimit('a:b:%s:%s:%s') async def ratelimit(self, method): try: mac_id = self.get_argument('id') except Exception as e: logging.error(e) return self.send_json(errcode=10001) return self.send_json()

 

 

Supongo que te gusta

Origin www.cnblogs.com/ExMan/p/12622612.html
Recomendado
Clasificación