Debouncing e Throttling¶
Debouncing e throttling reduzem o trabalho causado por sinais frequentes, mas oferecem garantias diferentes.
- debouncing espera um período de silêncio e agrega uma rajada, normalmente preservando o último valor;
- throttling permite trabalho no máximo na frequência ou no intervalo configurado enquanto os sinais continuam.
Debouncing serve para busca durante digitação ou sinais repetidos de recarga de configuração. Throttling serve para renderização de progresso ou telemetria cujos valores intermediários podem ser amostrados. Nenhum serve quando todo evento representa uma transição financeira, de auditoria, estoque ou workflow obrigatória.
Decisões semânticas¶
Antes da implementação, declare:
- borda inicial, final ou ambas;
- se prevalece o primeiro valor, o mais recente ou um agregado;
- espera máxima durante uma rajada contínua;
- escopo da chave: global, usuário, documento ou outra entidade;
- fonte de relógio e comportamento quando o tempo muda;
- políticas de cancelamento, encerramento e exceções.
Debounce somente na borda final pode adiar o trabalho para sempre quando os sinais não cessam; uma espera máxima evita starvation. Uma implementação por chave precisa limitar a retenção ou realizar limpeza. Em um cluster, estado local ao processo oferece política por instância, não uma garantia global.
Concorrência¶
Agendar uma tarefa substituta e cancelar a anterior deve ser atômico em relação à chave. O cancelamento pode competir com a execução; portanto, a ação deve tolerar uma tarefa obsoleta ou validar uma geração imediatamente antes do efeito. Nunca mantenha um lock compartilhado durante I/O lento.
Não use Thread.sleep em threads de requisição. Use escalonador, event loop,
operador de stream, gateway ou mecanismo durável de tarefas conforme o contrato de entrega.
Verificação¶
Use relógio controlável ou escalonador virtual. Teste um sinal, rajadas nos dois lados do intervalo, sinais contínuos, chaves concorrentes, corridas de cancelamento, falha do handler e encerramento. Meça trabalho suprimido, executado, atrasado e falho sem usar chaves ilimitadas como rótulos.
Rate limiting protege capacidade e justiça entre chamadores e aparece nos controles de resiliência.