Análise de Duplicação de Código¶
Autor: Anderson Henrique da Silva Data de Criação: 2025-10-16 15:45:00 -03:00 Última Atualização: 2025-10-16 16:05:00 -03:00 Objetivo: Documentar código duplicado identificado no projeto para futura consolidação
✅ STATUS DA CONSOLIDAÇÃO¶
Data de Conclusão: 2025-10-16 16:05:00 -03:00
Fase 1: Rate Limiting Cleanup - ✅ CONCLUÍDA¶
Resultado: Removidas 979 linhas de código duplicado (587 arquivos + 392 testes)
Commits Realizados:
1. 6726820 - refactor(middleware): remove duplicate rate limiting middleware
2. 24e2562 - refactor(rate-limit): remove unused rate limiting implementations
3. 3333a62 - test: remove obsolete rate limiting test file
Arquivos Removidos:
- src/api/middleware/rate_limiting.py (160 linhas)
- src/api/middleware/rate_limit_middleware.py (120 linhas)
- src/services/rate_limit_service.py (307 linhas)
- tests/unit/test_rate_limiting.py (392 linhas)
Arquivos Modificados:
- src/api/app.py - Removido middleware duplicado e import
Impacto: - ✅ Sem duplicação de rate limiting em cada requisição - ✅ Performance melhorada (um único middleware) - ✅ Headers de rate limit consistentes - ✅ Arquitetura mais limpa
Fase 2: Agent Pool Refactoring - ✅ CONCLUÍDA¶
Data de Conclusão: 2025-10-16 17:15:00 -03:00
Resultado: Refatoração arquitetural com renomeação e documentação
Commits Realizados:
1. 3ae0b44 - refactor(agents): rename agent_pool to simple_agent_pool
2. c3b43cd - refactor(infrastructure): rename agent_pool to distributed_agent_pool
3. 30bc40e - feat(agents): add agent pool interface definitions
4. 0d99e47 - docs: add comprehensive agent pool architecture guide
5. 55d5591 - fix(agents): update import in init.py for simple_agent_pool
6. 3d8f6fe - fix(tests): update imports in test_agent_pool.py
Arquivos Renomeados:
- src/agents/agent_pool.py → src/agents/simple_agent_pool.py
- src/infrastructure/agent_pool.py → src/infrastructure/distributed_agent_pool.py
Arquivos Criados:
- src/agents/agent_pool_interface.py (179 linhas) - Interface comum
- docs/AGENT_POOL_ARCHITECTURE.md (429 linhas) - Documentação completa
Imports Atualizados: - 15 arquivos atualizados para usar simple_agent_pool
Impacto: - ✅ Distinção clara entre simple e distributed pools - ✅ Interface comum para consistência arquitetural - ✅ Documentação abrangente de casos de uso - ✅ Sistema continua funcionando (verified import test) - ✅ Zero quebra de funcionalidade
📋 Sumário Executivo¶
Durante a auditoria da codebase realizada em 16/10/2025, foram identificados 2 casos principais de duplicação de código que requerem consolidação:
- Agent Pool - 2 implementações com propósitos diferentes mas sobrepostos
- Rate Limiting - 5 arquivos com funcionalidades parcialmente duplicadas
Impacto Atual: Baixo Prioridade de Consolidação: Média Esforço Estimado: 2-3 dias de desenvolvimento
1. Agent Pool Duplication¶
1.1. Arquivos Identificados¶
| Arquivo | Linhas | Propósito | Status |
|---|---|---|---|
src/agents/agent_pool.py |
376 | Simple agent pooling | ✅ Em uso |
src/infrastructure/agent_pool.py |
787 | Enterprise pool manager | ✅ Em uso |
1.2. Análise Detalhada¶
src/agents/agent_pool.py¶
Tipo: Simple Agent Pool Complexidade: Baixa-Média Características: - Pool básico para reutilização de instâncias de agentes - Lifecycle management (acquire/release) - Cleanup automático de agentes ociosos - Lazy loading support - Memory integration - Estatísticas simples (created, reused, evicted, errors)
Classes Principais:
class AgentPoolEntry:
"""Entry in the agent pool."""
- agent: BaseAgent
- in_use: bool
- last_used: datetime
- usage_count: int
- created_at: datetime
class AgentPool:
"""Pool manager for AI agents."""
- min_size: int = 2
- max_size: int = 10
- idle_timeout: int = 300
- max_agent_lifetime: int = 3600
- use_lazy_loading: bool = True
Métodos Principais:
- async def acquire(agent_type, context) - Context manager para adquirir agente
- async def _create_agent(agent_type) - Cria e inicializa novo agente
- async def _cleanup_idle_agents() - Remove agentes ociosos
- async def prewarm(agent_types) - Pré-aquece pool com agentes
src/infrastructure/agent_pool.py¶
Tipo: Enterprise Agent Pool Manager Complexidade: Alta Características: - Sistema distribuído para escalabilidade horizontal - Task queue com priorização (LOW, NORMAL, HIGH, CRITICAL) - Múltiplos modos de execução (ASYNC, THREAD, PROCESS, DISTRIBUTED) - Thread pool executor (4 workers padrão) - Process pool executor (2 workers padrão) - Auto-scaling baseado em utilização (threshold 80% up, 20% down) - Health checks automáticos - Métricas avançadas (queue time, execution time, success rate) - Retry logic com exponential backoff - Worker loop para processamento paralelo
Classes Principais:
class AgentTask:
"""Tarefa para execução por agente"""
- id, agent_type, method, args, kwargs
- priority: TaskPriority
- timeout: float
- retry_count / max_retries
- execution_mode: ExecutionMode
class AgentInstance:
"""Instância de agente no pool"""
- status: AgentStatus (IDLE, BUSY, ERROR, etc)
- total_tasks, successful_tasks, failed_tasks
- average_task_time
- process_id, thread_id
class AgentPoolManager:
"""Gerenciador avançado de pool de agentes"""
- Priority queue para tarefas
- Thread/Process pool executors
- Auto-scaling
- Health monitoring
- Métricas em tempo real
Métodos Principais:
- async def submit_task() - Submete tarefa para execução assíncrona
- async def get_task_result() - Aguarda resultado de tarefa
- async def _execute_task() - Executa tarefa com retry logic
- async def _scale_up_pool() / _scale_down_pool() - Auto-scaling
- async def _health_check_loop() - Monitoramento contínuo
1.3. Sobreposição de Funcionalidades¶
| Funcionalidade | Simple Pool | Enterprise Pool | Consolidável? |
|---|---|---|---|
| Agent reuse | ✅ | ✅ | ✅ Sim |
| Lifecycle management | ✅ | ✅ | ✅ Sim |
| Auto cleanup | ✅ | ✅ | ✅ Sim |
| Statistics | ✅ Básico | ✅ Avançado | ⚠️ Parcial |
| Task queue | ❌ | ✅ | ❌ Não |
| Priority system | ❌ | ✅ | ❌ Não |
| Thread/Process execution | ❌ | ✅ | ❌ Não |
| Auto-scaling | ❌ | ✅ | ❌ Não |
| Health checks | ❌ | ✅ | ❌ Não |
1.4. Recomendações¶
Estratégia: Manter ambas as implementações com refatoração parcial
Justificativa: - As implementações servem propósitos fundamentalmente diferentes - Simple pool: Reutilização simples de instâncias - Enterprise pool: Sistema completo de execução distribuída - Não são duplicações verdadeiras, mas sim soluções para diferentes escalas de problema
Ações Recomendadas:
-
Renomear para maior clareza (Prioridade: Alta)
-
Documentar casos de uso (Prioridade: Alta)
- Simple pool: Para APIs síncronas simples, desenvolvimento local
-
Enterprise pool: Para produção com alta carga, execução distribuída
-
Extrair interface comum (Prioridade: Média)
-
Consolidar código comum (Prioridade: Baixa)
- Extrair lógica de lifecycle para módulo compartilhado
- Unificar formato de estatísticas
- Compartilhar constantes (timeouts, thresholds)
Estimativa de Esforço: 4-6 horas
2. Rate Limiting Duplication¶
2.1. Arquivos Identificados¶
| Arquivo | Linhas | Propósito | Status |
|---|---|---|---|
src/infrastructure/rate_limiter.py |
435 | Advanced multi-strategy limiter | ✅ Em uso |
src/api/middleware/rate_limit.py |
239 | Middleware using infrastructure | ✅ Em uso |
src/api/middleware/rate_limiting.py |
160 | Simple sliding window | ⚠️ Legado? |
src/api/middleware/rate_limit_middleware.py |
120 | ? | ⚠️ Desconhecido |
src/services/rate_limit_service.py |
307 | Service layer | ⚠️ Desconhecido |
Total: 1,261 linhas de código relacionado a rate limiting
2.2. Análise Detalhada¶
src/infrastructure/rate_limiter.py (435 linhas)¶
Tipo: Advanced Rate Limiting Core Complexidade: Alta Características: - 4 estratégias de rate limiting: - FIXED_WINDOW - SLIDING_WINDOW (Redis sorted sets) - TOKEN_BUCKET (with Lua script) - LEAKY_BUCKET - 5 tiers de rate limit: - FREE: 1/s, 10/min, 100/h, 1K/day - BASIC: 5/s, 30/min, 500/h, 5K/day - PRO: 10/s, 60/min, 2K/h, 20K/day - ENTERPRISE: 50/s, 300/min, 10K/h, 100K/day - UNLIMITED: 9999/s, 99999/min, etc - Endpoint-specific limits com patterns (wildcards) - Redis + local fallback - Burst support - Cost tracking
Classes:
class RateLimitStrategy(Enum)
class RateLimitTier(Enum)
class RateLimitConfig
class RateLimiter:
async def check_rate_limit(key, endpoint, tier, custom_limits)
async def _check_fixed_window()
async def _check_sliding_window()
async def _check_token_bucket()
async def _check_leaky_bucket()
src/api/middleware/rate_limit.py (239 linhas)¶
Tipo: FastAPI Middleware Wrapper
Complexidade: Média
Características:
- Wrapper em torno de rate_limiter de infrastructure
- Extrai identificadores (API Key > User ID > IP)
- Integração com APIKey model
- Skip paths (/health, /metrics, /docs, etc)
- Response headers com rate limit info
- High usage warnings (quando <10% remaining)
- Fallback gracioso em caso de erro
Integração:
from src.infrastructure.rate_limiter import (
RateLimitStrategy,
RateLimitTier,
rate_limiter, # singleton instance
)
NÃO é duplicação - é o uso correto do rate limiter!
src/api/middleware/rate_limiting.py (160 linhas)¶
Tipo: Simple Sliding Window (Self-contained)
Complexidade: Baixa
Características:
- Implementação standalone de sliding window
- Apenas in-memory (dict + lists)
- Apenas 3 time windows: minute, hour, day
- Apenas identificação por IP
- NÃO usa src/infrastructure/rate_limiter.py
Potencial Problema: Duplicação de lógica!
class RateLimitMiddleware(BaseHTTPMiddleware):
def __init__(self, app, calls=60, period=60,
per_minute=60, per_hour=1000, per_day=10000):
# Self-contained implementation
self.clients: dict[str, dict[str, list]] = defaultdict(...)
Status: ⚠️ LEGADO - CANDIDATO PARA REMOÇÃO
2.3. Sobreposição de Funcionalidades¶
| Funcionalidade | infrastructure/rate_limiter | middleware/rate_limit | middleware/rate_limiting |
|---|---|---|---|
| Sliding window | ✅ (Redis + local) | ✅ (via infrastructure) | ✅ (in-memory) |
| Multiple tiers | ✅ 5 tiers | ✅ (via infrastructure) | ❌ |
| API Key support | ✅ | ✅ | ❌ |
| IP-based | ✅ | ✅ | ✅ |
| Endpoint patterns | ✅ | ✅ | ❌ |
| Redis support | ✅ | ✅ | ❌ |
| Token bucket | ✅ | ✅ | ❌ |
| Custom limits | ✅ | ✅ | ❌ |
2.4. Recomendações¶
Estratégia: Consolidar eliminando código legado
Ações Recomendadas:
-
Investigar uso dos arquivos legados (Prioridade: CRÍTICA)
-
Se NÃO estão em uso - REMOVER (Prioridade: Alta)
-
Se ESTÃO em uso - MIGRAR (Prioridade: Alta)
- Migrar código usando
rate_limiting.pypara usarrate_limit.py - Atualizar imports
-
Remover arquivo antigo
-
Documentar arquitetura final (Prioridade: Média)
ARQUITETURA FINAL DE RATE LIMITING: src/infrastructure/rate_limiter.py └─ Core logic (4 strategies, 5 tiers, Redis + local) src/api/middleware/rate_limit.py └─ FastAPI middleware wrapper └─ Uses rate_limiter singleton Usage in app: app.add_middleware(RateLimitMiddleware, default_tier=RateLimitTier.FREE, strategy=RateLimitStrategy.SLIDING_WINDOW)
Estimativa de Esforço: 2-4 horas
3. Outros Possíveis Duplicações (A Investigar)¶
3.1. API Clients¶
Verificar se há duplicação em clientes de APIs externas: - Portal da Transparência - IBGE, DataSUS, INEP - Outros serviços governamentais
3.2. Cache Implementations¶
Verificar implementações de cache: - In-memory cache - Redis cache - Agent-specific caches
3.3. Logging/Monitoring¶
Verificar se há código duplicado em: - Structured logging - Metrics collection - Error tracking
4. Plano de Consolidação¶
Fase 1: Investigação (1 dia)¶
- Executar grep/rg para encontrar todos os usos dos arquivos identificados
- Criar mapa de dependências
- Identificar código "morto" (não usado)
- Documentar imports e usages
Fase 2: Rate Limiting Cleanup (1 dia)¶
- Remover
rate_limiting.pyse não usado - Investigar
rate_limit_middleware.pyerate_limit_service.py - Migrar código se necessário
- Atualizar imports em todos os arquivos
- Executar todos os testes
- Atualizar documentação
Fase 3: Agent Pool Refactoring (1-2 dias)¶
- Renomear arquivos para maior clareza
- Extrair interface comum
AgentPoolInterface - Criar módulo compartilhado para código comum
- Documentar casos de uso de cada pool
- Atualizar imports
- Executar todos os testes
Fase 4: Documentação (0.5 dia)¶
- Atualizar architecture docs
- Criar decision records (ADRs)
- Atualizar CLAUDE.md e README.md
- Code review e aprovação
5. Riscos e Mitigações¶
Riscos Identificados¶
- Quebrar código em produção
- Mitigação: Testes extensivos antes de merge
-
Mitigação: Feature flags para rollback rápido
-
Performance degradation
- Mitigação: Benchmarks antes/depois
-
Mitigação: Load testing
-
Complexidade aumentada
- Mitigação: Manter simplicidade
- Mitigação: Documentação clara
6. Métricas de Sucesso¶
Antes da Consolidação¶
- 5 arquivos de rate limiting (1,261 linhas)
- 2 arquivos de agent pool (1,163 linhas)
- Total: 2,424 linhas de código potencialmente duplicado
Metas Após Consolidação¶
- 2-3 arquivos de rate limiting (<800 linhas)
- 2 arquivos de agent pool com interface comum (<1,200 linhas)
- Redução: 20-30% de código
- Cobertura de testes: Manter 80%+
- Performance: Sem degradação
7. Decisões Arquiteturais¶
ADR-001: Manter Dois Agent Pools¶
Context: Encontrados dois pools de agentes com funcionalidades sobrepostas
Decision: Manter ambas as implementações com refatoração parcial
Rationale: - Servem escalas diferentes de problema - Simple pool: Desenvolvimento local, APIs simples - Enterprise pool: Produção distribuída, alta carga - Consolidação total criaria complexidade desnecessária
Consequences: - Positive: Flexibility, separation of concerns - Negative: Maintenance overhead de 2 implementações - Mitigation: Interface comum, código compartilhado
ADR-002: Consolidar Rate Limiting¶
Context: 5 arquivos com lógica de rate limiting sobreposta
Decision: Manter apenas 2 arquivos (core + middleware)
Rationale:
- rate_limiting.py é versão simplificada legada
- rate_limiter.py + rate_limit.py são arquitetura correta
- Outros arquivos não identificados em uso
Consequences: - Positive: Codebase mais limpo, manutenção mais fácil - Negative: Possível quebra se código legado ainda usado - Mitigation: Investigação detalhada antes de remover
8. Conclusão¶
A análise identificou duplicação controlável no projeto:
✅ Agent Pools: Não é duplicação verdadeira - manter ambos ⚠️ Rate Limiting: Duplicação real - consolidar removendo código legado
Próximos Passos: 1. Executar Fase 1 (Investigação) para confirmar usos 2. Consolidar rate limiting (Quick win) 3. Refatorar agent pools (Médio prazo)
Impacto no Projeto: - Melhoria de ~500-700 linhas de código - Manutenibilidade aumentada - Arquitetura mais clara - Sem impacto em funcionalidade
Documento vivo: Este documento deve ser atualizado conforme o trabalho de consolidação progride.