Visto
Programação
Google
Gemini 2.5 Flash-Lite
VS
OpenAI
GPT-5 mini
Implemente um Limitador de Taxa Concorrente com Janela Deslizante e Filas de Prioridade
Desenhe e implemente um limitador de taxa seguro para threads em Python que suporte as seguintes funcionalidades:
1. **Controle de Taxa com Janela Deslizante**: O limitador deve usar um algoritmo de janela deslizante (não janelas fixas) para rastrear contagens de requisições. Dado um máximo de `max_requests` permitido dentro de um período de tempo `window_seconds`, ele deve determinar com precisão se uma nova requisição é permitida em qualquer momento.
2. **Múltiplos Níveis (Tiers)**: O limitador deve suportar múltiplos níveis nomeados (por exemplo, "free", "standard", "premium"), cada um com sua própria configuração de `max_requests` e `window_seconds`. Clientes são atribuídos a um nível no momento do registro.
3. **Fila de Prioridade para Requisições Adiadas**: Quando uma requisição é limitada pela taxa, em vez de simplesmente rejeitá-la, o limitador deve enfileirá-la em uma fila de prioridade por nível. Cada requisição tem uma prioridade inteira (número menor = maior prioridade). O limitador deve fornecer um método que, quando houver capacidade disponível, desenfileira e processa a requisição em espera de maior prioridade para um determinado cliente.
4. **Segurança para Threads**: Todas as operações (allow_request, enqueue, dequeue, register_client) devem ser seguras para chamadas concorrentes a partir de múltiplas threads.
5. **Limpeza (Cleanup)**: Forneça um método para remover dados de rastreamento expirados para clientes que não fizeram requisições nos últimos `cleanup_threshold_seconds` (configurável).
Sua implementação deve incluir:
- Uma classe `RateLimiter` com a interface descrita.
- Um `Request` dataclass ou named tuple contendo no mínimo: `client_id`, `timestamp`, `priority` e `payload`.
- Tratamento adequado de casos de borda: registro duplicado de cliente, requisições para clientes não registrados, filas de prioridade vazias, modificações concorrentes e questões de precisão do relógio.
Também escreva um script de demonstração (no bloco `if __name__ == "__main__"`) que:
- Crie um limitador de taxa com pelo menos dois níveis.
- Registre vários clientes.
- Simule um estouro de requisições a partir de múltiplas threads, mostrando algumas sendo permitidas e outras sendo enfileiradas.
- Mostre requisições adiadas sendo processadas quando a capacidade for liberada.
- Imprima saídas claras mostrando a sequência de eventos.
Explique suas escolhas de design em comentários, especialmente a respeito de sua implementação da janela deslizante, sua escolha de primitivas de sincronização e quaisquer trade-offs que você fez entre precisão e desempenho.