Construcción de una herramienta de validación de destinatarios de aves asíncrona masiva
Correo electrónico
·
26 may 2022

Puntos clave
El autor construyó una herramienta de validación de destinatarios a granel para validar millones de direcciones de correo electrónico de manera eficiente utilizando el API de Validación de Destinatarios de Bird.
Node.js demostró ser más rápido y escalable que Python debido a su I/O no bloqueante y la ausencia de limitaciones de GIL.
La herramienta lee archivos CSV de manera asincrónica, llama al API de validación para cada correo electrónico y escribe los resultados en un nuevo CSV en tiempo real.
El enfoque evita cuellos de botella de memoria y mejora el rendimiento a cerca de 100,000 validaciones en menos de un minuto.
Las mejoras futuras podrían incluir un mejor manejo de reintentos, una interfaz de usuario amigable o la migración a entornos sin servidor para escalabilidad.
Destacados de Q&A
¿Cuál es el propósito de la herramienta de Validación Asincrónica Masiva de Recipient?
Valida grandes volúmenes de direcciones de correo electrónico integrándose directamente con Bird’s Recipient Validation API, produciendo resultados verificados rápidamente sin cargas manuales.
¿Por qué se utilizó inicialmente Python y luego fue reemplazado por Node.js?
El bloqueo global del intérprete de Python (GIL) limitó la concurrencia, mientras que Node.js permitió la ejecución asincrónica verdadera, resultando en llamadas a API paralelas mucho más rápidas.
¿Cómo maneja la herramienta archivos grandes sin quedarse sin memoria?
En lugar de cargar todos los datos de una vez, el script procesa cada línea de CSV individualmente, enviando la solicitud de validación e inmediatamente escribiendo los resultados en un nuevo archivo CSV.
¿Qué problema resuelve la herramienta para los desarrolladores?
Permite la validación de listas de correo electrónico a escala, superando el límite de 20 MB del validador basado en la interfaz de usuario de SparkPost y eliminando la necesidad de cargar varios archivos manualmente.
¿Qué tan rápido es la versión final del programa?
Around 100,000 validaciones completadas en 55 segundos, en comparación con más de un minuto utilizando la versión de la UI.
¿Qué problemas se encontraron en sistemas Windows?
La agrupación de conexiones de cliente HTTP de Node.js causó errores “ENOBUFS” después de muchas solicitudes concurrentes, los cuales se solucionaron configurando la reutilización de conexiones de axios.
¿Qué mejoras futuras se sugieren?
Añadir manejo de errores y reintentos, crear una interfaz de usuario o implementar la herramienta como una Función Azure sin servidor para mejor escalabilidad y resiliencia.
Para alguien que busca un programa simple y rápido que acepte un csv, llame a la API de validación de receptores y produzca un CSV, este programa es para ti.
Al construir aplicaciones de correo electrónico, los desarrolladores a menudo necesitan integrar múltiples servicios y API. Comprender los fundamentos de la API de correo electrónico en infraestructura en la nube proporciona la base para construir herramientas robustas como el sistema de validación masiva que crearemos en esta guía.
Una de las preguntas que recibimos ocasionalmente es, ¿cómo puedo validar masivamente listas de correos electrónicos con validación de destinatarios? Hay dos opciones aquí, una es cargar un archivo a través del UI de SparkPost para la validación, y la otra es hacer llamadas individuales por correo electrónico a la API (ya que la API es de validación de correo electrónico único).
La primera opción funciona bien, pero tiene una limitación de 20Mb (aproximadamente 500,000 direcciones). ¿Qué pasa si alguien tiene una lista de correos electrónicos que contiene millones de direcciones? Podría significar dividir eso en miles de cargas de archivos CSV.
Dado que cargar miles de archivos CSV parece un poco exagerado, tomé ese caso de uso y comencé a preguntarme cuán rápido podría hacer que la API corriera. En esta publicación del blog, explicaré lo que probé y cómo finalmente llegué a un programa que podía realizar alrededor de 100,000 validaciones en 55 segundos (mientras que en el UI realicé unas 100,000 validaciones en 1 minuto 10 segundos).
Enfoque | Validaciones Probadas | Tiempo para Completar | Rendimiento Aprox. |
|---|---|---|---|
Herramienta Node.js asíncrona masiva | 100,000 | 55 segundos | ~1,818 validaciones/seg |
UI de SparkPost upload | 100,000 | 1 min 10 seg | ~1,428 validaciones/seg |
Y aunque esto todavía tomaría alrededor de 100 horas para completarse con aproximadamente 654 millones de validaciones, este script puede ejecutarse en segundo plano ahorrando tiempo significativo.
La versión final de este programa se puede encontrar aquí.
Mi primer error: usar Python
Mi segundo error: intentar leer el archivo en memoria
Mi idea inicial fue la siguiente:

Primero, ingerir una lista de correos electrónicos en formato CSV. Segundo, cargar los correos electrónicos en un array y verificar que están en el formato correcto. Tercero, llamar asincrónicamente la API de validación de destinatarios. Cuarto, esperar a los resultados y cargarlos en una variable. Y finalmente, exportar esta variable a un archivo CSV.
Esto funcionó muy bien para archivos más pequeños. El problema surgió cuando intenté ejecutar 100,000 correos electrónicos. El programa se detuvo alrededor de las 12,000 validaciones. Con la ayuda de uno de nuestros desarrolladores front-end, vi que el problema estaba en cargar todos los resultados en una variable (y, por lo tanto, quedarse sin memoria rápidamente). Si deseas ver la primera iteración de este programa, la he enlazado aquí: Version 1 (NOT RECOMMENDED).

Primero, ingerir una lista de correos electrónicos en formato CSV. Segundo, contar la cantidad de correos electrónicos en el archivo para propósitos de informes. Tercero, a medida que se lee cada línea de forma asincrónica, llamar a la API de validación de destinatarios y exportar los resultados a un archivo CSV.
Así, por cada línea leída, llamo a la API y escribo los resultados asincrónicamente para no mantener ninguno de estos datos en memoria a largo plazo. También eliminé la comprobación de sintaxis de correo electrónico después de hablar con el equipo de validación de destinatarios, ya que me informaron que la validación de destinatarios ya tiene comprobaciones integradas para verificar si un correo electrónico es válido o no.
Desglosando el código final
Siguientes pasos
Para alguien que está buscando un programa rápido y simple que tome un csv, llame a la API de validación de destinatarios y genere un CSV, este programa es para usted.
Algunas adiciones a este programa serían las siguientes:
Construir un front end o una interfaz de usuario más fácil de usar
Mejor manejo de errores y reintentos porque si por alguna razón la API arroja un error, el programa actualmente no reintenta la llamada
Considerar la implementación como una función de Azure sin servidor para escalamiento automático y gestión reducida de infraestructura
También me gustaría ver si se podrían lograr resultados más rápidos con otro lenguaje como Golang o Erlang/Elixir. Más allá de la elección del lenguaje, las limitaciones de infraestructura también pueden afectar el rendimiento - lo hemos aprendido de primera mano cuando enfrentamos límites de DNS no documentados en AWS que afectaron nuestros sistemas de procesamiento de correo electrónico de alto volumen.
Para desarrolladores interesados en combinar el procesamiento de API con herramientas de flujo de trabajo visual, descubran cómo integrar Flow Builder con Google Cloud Functions para flujos de trabajo de automatización sin código.
Por favor, no dude en proporcionarme cualquier comentario o sugerencia para expandir este proyecto.



