Créer un outil de validation des destinataires d'oiseaux asynchrones en vrac
·
26 mai 2022

Points Clés
L'auteur a construit un outil de validation de destinataires en masse pour valider des millions d'adresses e-mail de manière efficace en utilisant l'API de validation de destinataires de Bird.
Node.js s'est avéré plus rapide et plus évolutif que Python en raison de son I/O non bloquant et de l'absence de limitations GIL.
L'outil lit les fichiers CSV de manière asynchrone, appelle l'API de validation pour chaque e-mail et écrit les résultats dans un nouveau CSV en temps réel.
L'approche évite les goulets d'étranglement de mémoire et améliore le débit à environ 100,000 validations en moins d'une minute.
Les améliorations futures pourraient inclure une meilleure gestion des tentatives, une interface utilisateur conviviale, ou la migration vers des environnements serverless pour l'évolutivité.
Points forts des Q&A
Quel est l'objectif de l'outil de validation asynchrone en masse des destinataires ?
Il valide de grands volumes d'adresses email en s'intégrant directement à l'API de validation des destinataires de Bird, fournissant rapidement des résultats vérifiés sans téléchargements manuels.
Pourquoi Python a-t-il été initialement utilisé puis remplacé par Node.js ?
Le Verrou Global de l'Interpréteur (GIL) de Python limitait la concurrence, tandis que Node.js permettait une véritable exécution asynchrone, aboutissant à des appels d'API parallèles bien plus rapides.
Comment l'outil gère-t-il les fichiers volumineux sans manquer de mémoire ?
Au lieu de charger toutes les données en une seule fois, le script traite chaque ligne CSV individuellement—en envoyant la demande de validation et en écrivant immédiatement les résultats dans un nouveau fichier CSV.
Quel problème l'outil résout-il pour les développeurs ?
Il permet la validation de listes d'e-mails à grande échelle, dépassant la limite de 20 Mo du validateur basé sur l'interface utilisateur de SparkPost et éliminant le besoin de télécharger plusieurs fichiers manuellement.
Quelle est la rapidité de la version finale du programme ?
Environ 100 000 validations complètes en 55 secondes, contre plus d'une minute avec la version UI.
Quels problèmes ont été rencontrés sur les systèmes Windows ?
Le pool de connexions client HTTP Node.js a causé des erreurs « ENOBUFS » après de nombreuses requêtes simultanées, qui ont été corrigées en configurant la réutilisation des connexions axios.
Quelles améliorations futures sont suggérées ?
Ajouter la gestion des erreurs et des nouvelles tentatives, créer une interface frontale ou implémenter l'outil en tant que fonction Azure sans serveur pour une meilleure évolutivité et résistance.
Pour quelqu'un qui recherche un programme simple et rapide qui prend un csv, appelle l'API de validation des destinataires et produit un CSV, ce programme est fait pour vous.
Lors de la création d'applications de messagerie électronique, les développeurs doivent souvent intégrer plusieurs services et APIs. Comprendre les fondamentaux de l'email API dans l'infrastructure cloud fournit la base pour construire des outils robustes comme le système de validation en masse que nous créerons dans ce guide.
Une des questions que nous recevons parfois est : comment puis-je valider en masse des listes d'emails avec la validation des destinataires? Il y a deux options ici, l'une est de télécharger un fichier via l'interface utilisateur de SparkPost pour la validation, et l'autre est de passer des appels individuels par email à l'API (car l'API est une validation d'e-mails individuels).
La première option fonctionne très bien mais a une limitation de 20 Mo (environ 500,000 adresses). Et si quelqu'un a une liste d'emails contenant des millions d'adresses ? Cela pourrait signifier diviser cela en milliers de téléchargements de fichiers CSV.
Étant donné que le téléchargement de milliers de fichiers CSV semble un peu improbable, j'ai pris ce cas d'usage et j'ai commencé à me demander à quelle vitesse je pouvais faire fonctionner l'API. Dans ce billet de blog, j'expliquerai ce que j'ai essayé et comment j'en suis finalement arrivé à un programme qui pourrait obtenir environ 100,000 validations en 55 secondes (Alors que dans l'interface utilisateur, j'ai obtenu environ 100,000 validations en 1 minute et 10 secondes).
Approche | Validations Testées | Temps pour Terminer | Débit Approximatif |
|---|---|---|---|
Outil asynchrone Node.js | 100,000 | 55 secondes | ~1,818 validations/sec |
Upload via l'interface utilisateur SparkPost | 100,000 | 1 min 10 sec | ~1,428 validations/sec |
Et bien que cela prenne encore environ 100 heures pour réaliser environ 654 millions de validations, ce script peut fonctionner en arrière-plan, économisant un temps considérable.
La version finale de ce programme peut être trouvée ici.
My first mistake: utiliser Python
Ma deuxième erreur : essayer de lire le fichier en mémoire
Mon idée initiale était la suivante :

Premièrement, ingérer une liste d'e-mails au format CSV. Deuxièmement, charger les e-mails dans un tableau et vérifier qu'ils sont au format correct. Troisièmement, appeler de manière asynchrone l'API de validation des destinataires. Quatrièmement, attendre les résultats et les charger dans une variable. Et enfin, sortir cette variable dans un fichier CSV.
Cela a très bien fonctionné pour les petits fichiers. Le problème est survenu lorsque j'ai essayé de traiter 100 000 e-mails. Le programme s'est bloqué autour de 12 000 validations. Avec l'aide de l'un de nos développeurs front-end, j'ai vu que le problème venait du chargement de tous les résultats dans une variable (et donc de l'épuisement rapide de la mémoire). Si vous souhaitez voir la première version de ce programme, je l'ai liée ici : Version 1 (NON RECOMMANDÉE).

Premièrement, ingérer une liste d'e-mails au format CSV. Deuxièmement, compter le nombre d'e-mails dans le fichier à des fins de reporting. Troisièmement, à mesure que chaque ligne est lue de manière asynchrone, appeler l'API de validation des destinataires et sortir les résultats dans un fichier CSV.
Ainsi, pour chaque ligne lue, j'appelle l'API et écris les résultats de manière asynchrone afin de ne pas conserver ces données en mémoire à long terme. J'ai également retiré la vérification de la syntaxe des e-mails après avoir parlé avec l'équipe de validation des destinataires, car ils m'ont informé que la validation des destinataires intègre déjà des vérifications pour savoir si un e-mail est valide ou non.
Décomposition du code final
Étapes suivantes
Pour quelqu'un qui recherche un programme simple et rapide qui accepte un fichier CSV, appelle l'API de validation des destinataires et génère un CSV, ce programme est fait pour vous.
Voici quelques ajouts possibles à ce programme :
Construire une interface utilisateur ou un front-end plus facile à utiliser
Meilleure gestion des erreurs et des réessais, car si pour une raison quelconque l'API génère une erreur, le programme ne relance actuellement pas l'appel
Envisager la mise en œuvre en tant que fonction Azure sans serveur pour un dimensionnement automatique et une gestion réduite de l'infrastructure
Je serais également curieux de voir si des résultats plus rapides pourraient être obtenus avec un autre langage, tel que Golang ou Erlang/Elixir. Au-delà du choix de langage, les limites de l'infrastructure peuvent également affecter les performances - nous avons appris cela de première main lorsque nous avons atteint les limites DNS non documentées dans AWS qui ont affecté nos systèmes de traitement des e-mails à haut volume.
Pour les développeurs intéressés par la combinaison du traitement API avec les outils de flux de travail visuels, découvrez comment intégrer Flow Builder avec Google Cloud Functions pour des flux de travail d'automatisation sans code.
N'hésitez pas à me fournir tout retour ou suggestions pour l'expansion de ce projet.



