Skip to content

[BUG] Sistema de webhooks envia requisições duplicadas e não possui configuração de timeout e retentativas #1325

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
1 task done
guilhermejansen opened this issue Mar 21, 2025 · 0 comments
Labels
bug Something isn't working

Comments

@guilhermejansen
Copy link

Welcome!

  • Yes, I have searched for similar issues on GitHub and found none.

What did you do?

Analisei o mecanismo de webhooks do Evolution API e notei que existem limitações na forma como as retentativas e timeouts são gerenciados:

  1. O timeout da requisição não é configurável, o que causa problemas quando webhooks demoram mais que o esperado para responder.
  2. O sistema de retentativas tem valores fixos (10 tentativas com 30 segundos entre cada uma), sem possibilidade de configuração.
  3. O intervalo entre retentativas é fixo, não há backoff exponencial para evitar sobrecarregar servidores quando eles estão instáveis.
  4. Não há distinção entre erros recuperáveis e não-recuperáveis - o sistema tenta novamente mesmo em casos onde isso não faz sentido (como erro 404 ou 401).
  5. Bug crítico: O sistema está enviando o mesmo webhook múltiplas vezes (até 10 vezes) mesmo quando o servidor de destino está disponível e respondendo com sucesso. Isso causa duplicação de dados e processamento desnecessário no servidor de destino.

Isso causa problemas de estabilidade e desempenho em ambientes de produção com alto volume de webhooks ou quando os servidores de destino estão sob carga.

What did you expect?

Um sistema robusto de webhooks que:

  • Permita configurar o timeout de requisições via variáveis de ambiente
  • Permita ajustar os parâmetros de retentativa (máximo de tentativas, intervalo inicial, etc.)
  • Implemente backoff exponencial para aumentar gradualmente o tempo entre tentativas
  • Detecte e não tente novamente em casos de erros permanentes (códigos HTTP como 400, 401, 403, etc.)
  • Forneça logs detalhados sobre as tentativas e falhas
  • Mais importante: Reconheça corretamente respostas bem-sucedidas e não faça retentativas quando o webhook foi entregue com sucesso

What did you observe instead of what you expected?

  • Timeout fixo sem possibilidade de configuração
  • Retentativas constantes mesmo para erros permanentes, causando tráfego desnecessário
  • Intervalo fixo entre tentativas, sem crescimento exponencial
  • Possíveis problemas de "thundering herd" quando muitos webhooks falham ao mesmo tempo
  • Logs insuficientes para diagnóstico de falhas em webhooks
  • Bug crítico: Mesmo com o servidor de callback saudável e respondendo com códigos 200, o sistema continua reenviando o mesmo webhook até 10 vezes. Isso gera duplicação de dados e carga desnecessária tanto na nossa API quanto no servidor de destino.

Isso causa:

  1. Requisições ficando penduradas por longos períodos quando o servidor de destino está lento
  2. Recursos desperdiçados em tentativas que nunca serão bem-sucedidas (como enviar para URLs que retornam 404)
  3. Possível sobrecarga em servidores de destino devido ao padrão de retentativas sem backoff
  4. Processamento redundante e múltiplo de eventos que deveriam ser processados apenas uma vez

Screenshots/Videos

No response

Which version of the API are you using?

2.2.3

What is your environment?

Docker

Other environment specifications

No response

If applicable, paste the log output

No response

Additional Notes

Gostaria de ajudar com a implementação de uma solução que permita configurar timeout e retentativas via variáveis de ambiente, para tornar o sistema de webhooks mais robusto e configurável. Já implementei uma solução inicial que adiciona:

  1. Configuração de timeout via .env
  2. Sistema de retentativas com backoff exponencial
  3. Tratamento diferenciado para erros permanentes vs. temporários
  4. Logs melhorados para diagnóstico
  5. Correção do bug que causa duplicação de webhooks

Seria possível avaliar esta melhoria? Posso submeter um PR com as alterações e testes.

@guilhermejansen guilhermejansen added the bug Something isn't working label Mar 21, 2025
guilhermejansen added a commit to guilhermejansen/evolution-api that referenced this issue Mar 21, 2025
Adiciona interface de configuração na estrutura Webhook para permitir:
- Configuração de timeout em requisições
- Parâmetros de retentativas configuráveis
- Lista de códigos HTTP que não devem gerar retry

Issue: EvolutionAPI#1325
guilhermejansen added a commit to guilhermejansen/evolution-api that referenced this issue Mar 21, 2025
Adiciona novas variáveis para controlar o comportamento dos webhooks:
- WEBHOOK_REQUEST_TIMEOUT_MS: tempo máximo de espera
- WEBHOOK_RETRY_MAX_ATTEMPTS: número máximo de tentativas
- WEBHOOK_RETRY_INITIAL_DELAY_SECONDS: intervalo inicial
- WEBHOOK_RETRY_USE_EXPONENTIAL_BACKOFF: ativar backoff exponencial
- WEBHOOK_RETRY_MAX_DELAY_SECONDS: intervalo máximo entre tentativas
- WEBHOOK_RETRY_JITTER_FACTOR: fator de aleatoriedade
- WEBHOOK_RETRY_NON_RETRYABLE_STATUS_CODES: códigos de erro permanentes

Issue: EvolutionAPI#1325
guilhermejansen added a commit to guilhermejansen/evolution-api that referenced this issue Mar 21, 2025
Implementa timeout configurável nas requisições de webhook:
- Aplica configuração em todas as instâncias axios
- Usa valor padrão de 30 segundos se não configurado
- Evita requisições penduradas indefinidamente

Issue: EvolutionAPI#1325
guilhermejansen added a commit to guilhermejansen/evolution-api that referenced this issue Mar 26, 2025
…vas inteligente

Resolve EvolutionAPI#1325

- Adiciona configuração de timeout via variáveis de ambiente
- Implementa backoff exponencial com jitter para retentativas
- Detecta erros permanentes para evitar retentativas desnecessárias
- Corrige bug de duplicação de webhooks
- Melhora logs para diagnóstico
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
1 participant