Pular para o conteúdo

apps/resiliency/throttling

112 · Resiliência & Tolerância a Falhas · ≈ 6 min de estudo

Throttling

Limita as chamadas que o próprio sistema faz a um terceiro, para nunca passar da cota que ele impõe. O excedente é atrasado, não descartado: cada chamada espera um token de um bucket no Redis compartilhado por todas as réplicas. É o inverso do rate limiting — protege o fornecedor e o contrato com ele, não o próprio serviço.

passos
6
arquivos
5
testes
0
tecnologias
5
Infraestrutura realTypeScriptBunElysiaRedisDocker
Baixar cartão

Cenário

A API do BACEN aceita 10 consultas de status de PIX por segundo por integrador e responde 429 acima disso. Duas réplicas do banco consultam 20 PIX cada, ao mesmo tempo. Direto, o BACEN atende 10 e recusa 30. Pelo bucket compartilhado (8 de rajada, 9 por segundo, um pouco abaixo da cota), as 40 consultas são atendidas em cerca de 3,5 s, sem nenhum 429.

Planta

Sequência
10/10
EVAL pega token1concedido2GET /pix/E1/status32004EVAL pega token5negado, próximo em 111 ms6espera, não chama o BACENEVAL pega token7concedido8GET /pix/E2/status920010Réplica 1Réplica 2Redis (bucket)API BACEN (10/s)
10

10 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Auto-limita chamadas de saída.

Esconde cada passo: lembre antes de tocar para revelar.

Vocabulário compartilhado

  1. 01

    bucketTake roda um script Lua: repõe tokens pelo tempo decorrido, limita à capacidade e consome um, num passo atômico

  2. 02

    Sem token, o script devolve quanto falta para o próximo (waitMs); throttleAcquire espera e tenta de novo, sem nunca chamar o BACEN antes

  3. 03

    O bucket fica no RedisRéplicas somam uma cota só, e não N vezes a cota

  4. 04

    updatedAt nunca volta no tempo: réplica com relógio atrasado não cria tokens

  5. 05

    Capacidade e taxa ficam um pouco abaixo da cota do BACEN, margem para relógio e rede

  6. 06

    O tempo médio de espera no bucket é a métrica: crescendo, a demanda passou da cota contratada

Trade-offs

O que se ganha, o que se paga

3 vantagenscada ganho tem um preço3 custos

Vantagens

  • O fornecedor nunca recebe mais que a cota, então não há 429

  • Cota única para a frota inteira

  • Excedente atrasado, nenhum descartado

Custos

  • As chamadas excedentes ficam mais lentas

  • Cada chamada de saída custa uma ida ao Redis

  • Demanda acima da cota acumula espera sem limite

apps/resiliency/throttling

5 arquivos

src/

  • throttle_bucket.tsToken bucket atômico em Lua e a espera pelo próximo token
  • client_bacen.tsConsulta de status do PIX atrás do bucket, calibrado abaixo da cota
  • bacen_api.tsAPI do BACEN em ElysiaJS com a própria cota de 10/s e resposta 429
  • config_throttle.tsConfiguração validada do ambiente
  • demo.tsdemoDuas réplicas em rajada, direto e pelo bucket

Executar · com Docker

  1. ./docker.sh up# sobe Redis
  2. bun install# dependências
  3. bun run demo# roda o cenário
  4. bun run test# integração contra o serviço real
Requisitos
BunDocker
Sobe junto
Redis

Por que se relacionam

Teste rápido

Qual é o próximo passo depois de Throttling?

Próximo projeto · API & IntegraçãoAPI Gateway
Esc

↑ ↓ navegarEnter abrir191 resultados