Configurar rate limite para API em vtexio

Olá pessoal!

gostaria de saber se existe alguma forma de configurar um rate limite em uma api que estou construindo com base nesse repo da vtex: GitHub - vtex-apps/service-example: A reference app implementing a VTEX IO service with http route handlers

1 Like

Olá @Erislandio,

De acordo com a documentação de serviços do VTEX IO, os parâmetros de infraestrutura configuráveis são esses:

{
  "memory": 256,
  "ttl": 10,
  "timeout": 2,
  "minReplicas": 2,
  "maxReplicas": 4,
  "routes": {
    "status": {
      "path": "/_v/status/:code",
      "public": true
    }
  }
}

Olá, Eris.

Sim, é possível e bem simples.

1º Instale a biblioteca rate-limiter-flexible

2º Crie um arquivo e cole o código:

import { RateLimiterMemory } from 'rate-limiter-flexible'

type RateLimiterRes = {
  remainingPoints: number
  msBeforeNext: number
  consumedPoints: number
  isFirstInDuration: boolean
}

const rateLimitOpts = {
  points: 10,
  duration: 60,
}

const rateLimiterMemory = new RateLimiterMemory(rateLimitOpts)

export async function rateLimiter(ctx: Context): Promise<RateLimiterRes> {
  const [requestIp]: [string] = ctx.headers['x-forwarded-for'].split(',')
  
  return rateLimiterMemory.consume(requestIp, 1) // consume 1 points
  .then(async (rateLimiterRes: RateLimiterRes) => {
      console.log(requestIp, rateLimiterRes)
      return rateLimiterRes  
    })
    .catch((rateLimiterRes: RateLimiterRes) => {
      console.log(requestIp, rateLimiterRes)
      const retryAfter = rateLimiterRes.msBeforeNext / 1000
      throw new Error(`Too many request. Retry-after ${retryAfter}s`)
    })
}

Obs: configure os parametros conforme a sua necessidade.

3º Faça o import da função rateLimiter que você acabou de criar dentro do seu middlware por exemplo e faça a chamada.
Ex: await rateLimiter(ctx)

4 Likes

This topic was automatically closed 24 hours after the last reply. New replies are no longer allowed.