Um proxy resiliente e inteligente para consumir a API de score externa com gestão automática de rate limiting (1 req/s), cache e fila de requisições.
- 🚦 Rate Limiting Inteligente - Respeita o limite de 1 requisição/segundo da API externa
- 💾 Cache em Memória - Memoriza respostas recentes para evitar chamadas desnecessárias
- 🎯 Fila com Backpressure - Gerencia picos de até 20 requisições simultâneas
- 📊 Métricas em Tempo Real - Monitoramento do status da fila, cache e sistema
- 🔒 Singleton Pattern - Garante uma única instância do rate limiter e fila
- 🎨 Decorator Pattern - Cache automático com decorators elegantes
graph TB
A[Cliente] --> B[GET /proxy/score]
B --> C{Cache Hit?}
C -->|Sim| D[Retorna do Cache]
C -->|Não| E[Fila de Requisições]
E --> F[Scheduler 1req/s]
F --> G[API Externa]
G --> H[Atualiza Cache]
H --> I[Retorna Resposta]
proxy-score-api/
├── api/
│ └── score_api.py # Integração com API externa
├── utils/
│ ├── rate_limiter.py # Singleton para rate limiting
│ ├── cache.py # Decorator pattern para cache
│ └── request_queue.py # Fila com threading
├── app.py # Aplicação FastAPI
├── main.py # Ponto de entrada
├── test_burst.py # Teste de carga
└── requirements.txt # Dependências
- Python 3.8+
- pip (gerenciador de pacotes)
# 1. Clone o repositório
git clone https://github.com/pedrossoledade/Proxy-Interno.git
cd Proxy-Interno
# 2. Instale as dependências
pip install -r requirements.txt
# 3. Execute a aplicação
python main.py
# Em outro terminal, teste
python test_server.py
python test_burst.py# Fazer uma consulta de score
curl "http://localhost:8000/proxy/score?cpf=12345678900&client_id=seu_client_id"
# Verificar saúde da aplicação
curl http://localhost:8000/health
# Consultar métricas
curl http://localhost:8000/metricsConsulta o score de um CPF na API externa.
Parâmetros:
cpf(string, obrigatório): CPF a ser consultado (11 dígitos)client_id(string, obrigatório): Client ID para autenticação na API externa
Exemplo:
curl "http://localhost:8000/proxy/score?cpf=89336333089&client_id=000"Endpoint de health check para verificar se o serviço está operacional.
Resposta:
{
"status": "healthy"
}Endpoint de métricas para monitoramento do sistema.
Resposta:
{
"queue_size": 0,
"cache_size": 5,
"processing": false,
"system_status": "operational"
}Simula 20 requisições simultâneas para validar a resiliência do proxy:
python test_burst.pySaída esperada:
Tempo total: 20.15s
Requisições/s: 0.99
Sucessos: 20/20
import requests
response = requests.get(
"http://localhost:8000/proxy/score",
params={"cpf": "89336333089", "client_id": "000"}
)
print(response.json())Os CPFs presentes neste projeto foram gerados artificialmente para fins de teste e desenvolvimento, utilizando o Gerador de CPF do site 4Devs.
Nenhum dos números corresponde a documentos reais de pessoas conhecidas.
| Variável | Descrição | Padrão |
|---|---|---|
CLIENT_ID |
Client ID para API externa | - |
# Linux/Mac
export CLIENT_ID="seu_client_id_aqui"
# Windows (PowerShell)
$env:CLIENT_ID="seu_client_id_aqui"
# Windows (CMD)
set CLIENT_ID=seu_client_id_aqui# Garante uma única instância do rate limiter
class RateLimiter:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance# Cache automático com decorator
@cached(ttl=300)
def get_score(id_client, cpf):
# Lógica da função
return result