es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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í).

Tags:  , , ,

Answer

  1. Avatar for 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:

    function envoy_on_request(request_handle)
      request_handle:logInfo("Retrasando la solicitud...")
      local delay = "1000"
      request_handle:headers():add("X-Delay", delay)
      request_handle:headers():add("X-Delayed-Request", "Verdadero")
    end
    

    Luego podemos configurar el proxy de Envoy para que use este script de Lua agregando el siguiente filtro en el archivo YAML:

    name: envoy.lua
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
      inline_code: |
        function envoy_on_request(request_handle)
          request_handle:logInfo("Retrasando la solicitud...")
          local delay = "1000"
          request_handle:headers():add("X-Delay", delay)
          request_handle:headers():add("X-Delayed-Request", "Verdadero")
        end
    

    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.

Comments are closed.