¿Es posible lograr un retraso en la solicitud con LocalRatelimit?
Estoy utilizando LocalRatelimit de Envoy.
Información de la versión:
– istio 1.11.4
– Envoy v1.19.1
– Kubernets 1.12 (bare metal)
Para que la solicitud sea resistente a ráfagas, se especifica el Token Bucket de la siguiente manera.
name: envoy.filters.http.local_ratelimit
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit
stat_prefix: http_local_rate_limiter
token_bucket:
max_tokens: 200
tokens_per_fill: 20
fill_interval: 1s
filter_enabled:
runtime_key: local_rate_limit_enabled
default_value:
numerator: 100
denominator: HUNDRED
filter_enforced:
runtime_key: local_rate_limit_enforced
default_value:
numerator: 100
denominator: HUNDRED
response_headers_to_add:
- append: false
header:
key: x-local-rate-limit
value: "true"
Referencia: https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/local_rate_limit_filter
Esto significa que se pueden aceptar un máximo de 200 solicitudes por segundo, y luego, cada segundo, el Token se recuperará en 20 para prepararse para la próxima ráfaga.
Sin embargo, lo que quiero lograr ahora no es que estas 200 solicitudes por segundo lleguen inmediatamente al servidor upstream, sino permitir cierto retraso y enviar la solicitud al servidor upstream. Específicamente, estoy buscando algo equivalente a la opción de retraso en la directiva limit_req de Nginx.
Referencia: http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
¿Existe alguna función en Envoy para especificar esta característica de retraso? Si no es así, ¿se implementará en el futuro?
Este post se ha publicado en el grupo de usuarios de EnvoyProxy (aquí).
davy.ai
Usando LocalRatelimit de Envoy con la función de retraso
Como experto en tecnología de la información especializado en nginx, istio, envoyproxy y la limitación de velocidad, entiendo que se puede utilizar LocalRatelimit de Envoy para hacer que las solicitudes sean resistentes a ráfagas especificando la configuración del Token Bucket en el archivo YAML.
Sin embargo, la limitación máxima de velocidad de 200 rps especificada en el archivo YAML puede no ser adecuada para todos los casos de uso. Por ejemplo, a veces podemos querer enviar las solicitudes al servidor de upstream con un cierto retraso en lugar de enviarlas inmediatamente, similar a la opción de retraso de nginx en la directiva limit_req.
Desafortunadamente, Envoy no tiene una función incorporada para especificar la opción de retraso para LocalRatelimit. Sin embargo, podemos implementar esta función aplicando una lógica personalizada utilizando la secuencia de comandos de Lua con el filtro Lua de Envoy.
En la secuencia de comandos de Lua, podemos retrasar la solicitud agregando un retraso en el encabezado de la solicitud, y el servidor de upstream puede leer el retraso para esperar el tiempo especificado antes de procesar la solicitud.
Para agregar un retraso, podemos utilizar la tabla “headers” en el script de Lua y agregar el encabezado “X-Delay” con el valor de retraso requerido. También deberemos agregar un encabezado personalizado nuevo para indicar al servidor de upstream que la solicitud ha sido retrasada, como “X-Delayed-Request”.
Aquí hay un ejemplo de script de Lua para agregar un retraso de 1 segundo:
Luego podemos configurar el proxy de Envoy para que use este script de Lua agregando el siguiente filtro en el archivo YAML:
Con este filtro de Lua, cada solicitud que pase por Envoy tendrá los encabezados “X-Delay” y “X-Delayed-Request” agregados. Luego, el servidor de upstream puede verificar el encabezado “X-Delayed-Request” para ver si la solicitud ha sido retrasada y esperar el tiempo especificado antes de procesarla.
En conclusión, aunque no hay una función incorporada en LocalRatelimit de Envoy para especificar una opción de retraso, aún podemos lograr esta función utilizando la secuencia de comandos de Lua con el filtro Lua de Envoy.