Construindo uma Ferramenta de Validação de Recebedores de Pássaros em Lote Assíncronos
·

Principais Conclusões
O autor construiu uma ferramenta de validação de destinatários em massa para validar milhões de endereços de e-mail de forma eficiente usando a API de Validação de Destinatários do Bird.
O Node.js provou ser mais rápido e escalável que o Python devido ao seu I/O não bloqueante e à ausência de limitações do GIL.
A ferramenta lê arquivos CSV de forma assíncrona, chama a API de validação para cada e-mail e grava os resultados em um novo CSV em tempo real.
A abordagem evita gargalos de memória e melhora a taxa de processamento para cerca de 100.000 validações em menos de um minuto.
Melhorias futuras podem incluir um melhor manuseio de tentativas, uma interface amigável ou migração para ambientes sem servidor para escalabilidade.
Destaques de Perguntas e Respostas
Qual é o propósito da Ferramenta de Validação de Destinatários Assíncrona em Massa?
Ele valida grandes volumes de endereços de email, integrando-se diretamente com a API de Validação de Destinatários do Bird, devolvendo resultados verificados rapidamente sem uploads manuais.
Por que o Python foi inicialmente usado e depois substituído pelo Node.js?
O Global Interpreter Lock (GIL) do Python limitou a concorrência, enquanto o Node.js permitia a execução assíncrona verdadeira, resultando em chamadas de API paralelas muito mais rápidas.
Como a ferramenta lida com arquivos grandes sem ficar sem memória?
Em vez de carregar todos os dados de uma vez, o script processa cada linha CSV individualmente - enviando a solicitação de validação e imediatamente escrevendo os resultados em um novo arquivo CSV.
Que problema a ferramenta resolve para os desenvolvedores?
Ele permite validação de listas de e-mails em grande escala, superando o limite de 20MB do validador baseado na interface do SparkPost e eliminando a necessidade de carregar múltiplos arquivos manualmente.
Quão rápido é a versão final do programa?
Cerca de 100.000 validações completas em 55 segundos, em comparação a mais de um minuto usando a versão da interface do usuário.
Quais problemas foram encontrados nos sistemas Windows?
A conexão de pooling do cliente HTTP Node.js causou erros "ENOBUFS" após muitas solicitações concorrentes, que foram corrigidos configurando a reutilização de conexões do axios.
Quais melhorias futuras são sugeridas?
Adicionando tratamento de erros e tentativas, criando uma interface de front-end ou implementando a ferramenta como uma Função do Azure sem servidor para melhor escalabilidade e resiliência.
Para alguém que está procurando um programa simples e rápido que aceite um CSV, chame a API de validação de destinatários e gere um CSV, este programa é para você.
Ao construir aplicações de email, os desenvolvedores frequentemente precisam integrar vários serviços e APIs. Entender os fundamentos da API de email na infraestrutura de nuvem fornece a base para construir ferramentas robustas como o sistema de validação em massa que criaremos neste guia.
Uma das perguntas que ocasionalmente recebemos é: como posso validar listas de emails em massa com validação de destinatários? Existem duas opções aqui: uma é fazer o upload de um arquivo através da interface do SparkPost para validação, e a outra é fazer chamadas individuais por email para a API (como a API é uma validação de email único).
A primeira opção funciona muito bem, mas tem uma limitação de 20Mb (cerca de 500.000 endereços). E se alguém tiver uma lista de emails contendo milhões de endereços? Isso poderia significar dividir em milhares de uploads de arquivos CSV.
Como fazer upload de milhares de arquivos CSV parece um pouco fora da realidade, peguei esse caso de uso e comecei a me perguntar quão rápido eu poderia fazer a API funcionar. Neste post do blog, explicarei o que eu tentei e como eventualmente cheguei a um programa que poderia realizar cerca de 100.000 validações em 55 segundos (Enquanto na interface obtive cerca de 100.000 validações em 1 minuto e 10 segundos).
Abordagem | Validações Testadas | Tempo para Completar | Aproximadamente Vazão |
|---|---|---|---|
Ferramenta Node.js assíncrona em massa | 100.000 | 55 segundos | ~1.818 validações/segundo |
Upload da interface do SparkPost | 100.000 | 1 min 10 seg | ~1.428 validações/segundo |
E enquanto isso ainda levaria cerca de 100 horas para ser feito com cerca de 654 milhões de validações, este script pode ser executado em segundo plano economizando tempo significativo.
A versão final deste programa pode ser encontrada aqui.
Meu primeiro erro: usar Python
Meu segundo erro: tentar ler o arquivo na memória
Minha ideia inicial era a seguinte:

Primeiro, faça a ingestão de uma lista de e-mails em CSV. Em segundo lugar, carregue os e-mails em um array e verifique se estão no formato correto. Terceiro, faça uma chamada assíncrona à API de validação do destinatário. Quarto, aguarde os resultados e os carregue em uma variável. E finalmente, coloque essa variável em um arquivo CSV.
Isso funcionou muito bem para arquivos menores. O problema surgiu quando tentei processar 100.000 e-mails. O programa travou em cerca de 12.000 validações. Com a ajuda de um dos nossos desenvolvedores front-end, percebi que o problema estava em carregar todos os resultados em uma variável (e, portanto, acabar rapidamente com a memória). Se você quiser ver a primeira iteração deste programa, eu a vinculei aqui: Versão 1 (NÃO RECOMENDADA).

Primeiro, faça a ingestão de uma lista de e-mails em CSV. Em segundo lugar, conte o número de e-mails no arquivo para fins de relatório. Terceiro, conforme cada linha é lida de forma assíncrona, chame a API de validação do destinatário e escreva os resultados em um arquivo CSV.
Assim, para cada linha lida, chamo a API e escrevo os resultados de forma assíncrona para não manter nenhum desses dados na memória a longo prazo. Também removi a verificação de sintaxe de e-mail após conversar com a equipe de validação do destinatário, pois eles me informaram que a validação do destinatário já possui verificações internas para verificar se um e-mail é válido ou não.
Desmembrando o código final
Próximos Passos
Para alguém que está procurando um programa simples e rápido que aceite um csv, chame a API de validação do destinatário e saia com um CSV, este programa é para você.
Algumas adições a este programa seriam as seguintes:
Construir um front-end ou uma interface mais fácil de usar
Melhorar o tratamento de erros e tentativas, pois se por algum motivo a API gerar um erro, o programa atualmente não tenta novamente a chamada
Considerar implementar como uma Função sem servidor do Azure para escalonamento automático e redução da gestão de infraestrutura
Eu também teria curiosidade em ver se resultados mais rápidos poderiam ser alcançados com outra linguagem como Golang ou Erlang/Elixir. Além da escolha da linguagem, limitações de infraestrutura também podem impactar o desempenho - aprendemos isso na prática quando enfrentamos limites de DNS não documentados na AWS que afetaram nossos sistemas de processamento de e-mails de alto volume.
Para desenvolvedores interessados em combinar o processamento de API com ferramentas de fluxo de trabalho visuais, veja como integrar o Flow Builder com as Google Cloud Functions para fluxos de trabalho de automação sem código.
Fique à vontade para me enviar qualquer comentário ou sugestão para expandir este projeto.



