{"id":28589604,"url":"https://github.com/igorbrizack/rate-limiter-system-design","last_synced_at":"2025-08-09T16:23:34.190Z","repository":{"id":297312142,"uuid":"996376289","full_name":"IgorBrizack/rate-limiter-system-design","owner":"IgorBrizack","description":null,"archived":false,"fork":false,"pushed_at":"2025-06-05T01:37:14.000Z","size":19,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-05T02:51:19.990Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/IgorBrizack.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-04T21:32:53.000Z","updated_at":"2025-06-04T22:01:58.000Z","dependencies_parsed_at":"2025-06-05T02:51:28.424Z","dependency_job_id":"1a7463ac-dc61-46cf-a200-3b949f724dc1","html_url":"https://github.com/IgorBrizack/rate-limiter-system-design","commit_stats":null,"previous_names":["igorbrizack/rate-limiter-system-design"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IgorBrizack%2Frate-limiter-system-design","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IgorBrizack%2Frate-limiter-system-design/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IgorBrizack%2Frate-limiter-system-design/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IgorBrizack%2Frate-limiter-system-design/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/IgorBrizack","download_url":"https://codeload.github.com/IgorBrizack/rate-limiter-system-design/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IgorBrizack%2Frate-limiter-system-design/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259227958,"owners_count":22824904,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-11T08:10:25.934Z","updated_at":"2025-06-11T08:10:28.580Z","avatar_url":"https://github.com/IgorBrizack.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Rate Limiter\n\nNesse repositório você encontrará como implementar alguns exemplos de rate limiter para a sua API, entenderá algumas nuances que envolvem a sua aplicação e entenderá na prática como eles funcionam. Os exemplos aqui presentes podem ser acessados através do livro System Design Interview - An insider's guide.\n\n# Design\n\n\u003cimg src=\"imgs/design.png\" alt=\"Design\" style=\"width:700px; height:300px\"\u003e\n\u003cbr\u003e\u003cbr/\u003e\n\n# O que é um Rate Limiter\n\nO que é um Rate Limiter?\nUm Rate Limiter (limitador de taxa) é um mecanismo usado para controlar a frequência com que um cliente pode acessar um recurso ou serviço dentro de um determinado intervalo de tempo.\n\nEle serve para:\n\n- Proteger serviços contra abuso ou ataques de negação de serviço (DoS);\n\n- Evitar sobrecarga em APIs ou servidores;\n\n- Aplicar limites por usuário, IP, token de API, etc.;\n\n- Manter qualidade de serviço para todos os usuários.\n\n# 📊 Principais algoritmos de rate limiting\n\n1. 🪣 Fixed Window (Janela Fixa)\n\n   - Divide o tempo em blocos (ex: a cada minuto).\n\n   - Conta quantas requisições foram feitas naquela janela.\n\n   - Simples, mas pode causar picos de requisições nas bordas das janelas.\n\n2. 🧮 Sliding Window (Janela Deslizante)\n\n   - Janela de tempo é baseada na hora atual menos X segundos.\n\n   - Mais justo que a janela fixa, mas mais complexo de implementar.\n\n3. 💧 Leaky Bucket (Balde com vazamento)\n\n   - Imita um balde que vaza a uma taxa constante.\n\n   - Requisições entram no balde, e se ele encher, são rejeitadas.\n\n   - Suaviza a taxa de requisições.\n\n4. 🛢️ Token Bucket\n\n   - Um balde acumula \"tokens\" ao longo do tempo.\n\n   - Cada requisição consome um token.\n\n   - Se não houver tokens, a requisição é negada.\n\n   - Permite pequenos \"estouros\" de requisições, ideal para sistemas que precisam de burst tolerance.\n\n## Tolerância a Burst\n\nA tolerância a burst (ou burst tolerance) se refere à capacidade de um algoritmo de rate limiting permitir picos curtos e intensos de requisições em um curto espaço de tempo, sem violar o limite total.\n\n### 🧠 Exemplificando:\n\n    Suponha:\n        - Limite: 10 requisições por minuto\n\n        Dois usuários enviam requisições:\n\n            Caso com tolerância a burst (ex: Token Bucket):\n                -   Um usuário envia 10 requisições de uma vez → 💚 Aceito (bucket cheio).\n                -   Depois, ele precisa esperar o refill dos tokens.\n\n            Caso sem tolerância a burst (ex: Leaking Bucket):\n                -   O sistema só permite, por exemplo, 1 requisição a cada 6 segundos.\n                -   Mesmo que ele tenha feito zero requisições antes, se tentar 10 de uma vez → ❌ Só a 1ª entra, as outras são rejeitadas.\n\n## 📊 Comparação rápida - Algoritmo Tolerância a Burst Comportamento:\n\n    - Token Bucket - Alta - Permite picos rápidos até encher o balde\n    - Leaking Bucket - Baixa - Fluxo constante, limita picos abruptos\n    - Fixed Window - Média - Depende do momento em que o \"clock\" reinicia\n    - Sliding Window - Média/Alta - Mais equilibrado entre burst e suavização\n\n### ✅ Quando usar alta tolerância a burst? - APIs públicas que devem ser rápidas com picos pequenos.\n\n    - Sistemas tolerantes a carga variável.\n    - Usuários legítimos que fazem ações em lote (ex: dashboards, scripts).\n\n### ❌ Quando evitar? - Quando o sistema backend é sensível a carga repentina.\n\n    - Quando você precisa garantir um ritmo constante e previsível (ex: filas de mensagens, robôs de consumo de dados).\n\n## Iniciando o projeto\n\n📌 Configurando o Backend:\n\n- Na pasta do backend crie um arquivo .env com as credenciais semelhantes ao do arquivo .env.example.\n\n📌 Construindo a imagem dos nossos serviços.\n\n- `docker-compose up -d --build`\n\n📌 Verificando se os serviços estão rodando.\n\n- `docker ps`\n\n## 🎯 Realizando testes na nossa aplicação\n\nURL API: http://localhost:8100\n\nRotas:\n\n- POST (/users)\n\n```json\nBody da requisição\n{\n  \"name\": \"teste\",\n  \"second_name\": \"sobrenome\"\n}\n```\n\n- GET (/users)\n\n```json\nResponse da requisição\n{\n\t\"source\": \"database\",\n\t\"users\": [\n\t\t{\n\t\t\t\"id\": 1,\n\t\t\t\"name\": \"teste\",\n\t\t\t\"second_name\": \"sobrenome\",\n\t\t\t\"created_at\": \"2025-03-29T16:34:19Z\",\n\t\t\t\"updated_at\": \"2025-03-29T16:34:19Z\"\n\t\t}]\n}\n```\n\n## Alternando os middlewares de Reate Limiter\n\nEm cmd/main.go altere nas rotas entre os tipos de rate limiter que quer aplicar para testes. Abaixo seguem os exemplos.\n\n- router.POST(\"/users\", rateLimiter.FixedWindowHandler(1\\*time.Second, 1.0), userController.CreateUser)\n- router.POST(\"/users\", rateLimiter.TokenBucketHandler(5, 1.0), userController.CreateUser)\n- router.POST(\"/users\", rateLimiter.LeakingBucketHandler(5, 1.0), userController.CreateUser)\n\n\u003cimg src=\"imgs/headers.png\" alt=\"Design\" style=\"width:700px; height:300px\"\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Figorbrizack%2Frate-limiter-system-design","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Figorbrizack%2Frate-limiter-system-design","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Figorbrizack%2Frate-limiter-system-design/lists"}