Entwicklung eines Bulk-Asynchronen Vogel-Empfänger-Validierungstools
·

Wichtige Erkenntnisse
Der Autor hat ein Tool zur Validierung von Massenempfängern entwickelt, um Millionen von E-Mail-Adressen effizient mit der Recipient Validation API von Bird zu validieren.
Node.js erwies sich als schneller und skalierbarer als Python aufgrund seines nicht blockierenden I/O und der fehlenden GIL-Beschränkungen.
Das Tool liest CSV-Dateien asynchron ein, ruft die Validation API für jede E-Mail auf und schreibt die Ergebnisse in Echtzeit in eine neue CSV.
Der Ansatz vermeidet Speicherengpässe und verbessert den Durchsatz auf etwa 100.000 Validierungen in weniger als einer Minute.
Zukünftige Verbesserungen könnten eine bessere Wiederholungsverwaltung, eine benutzerfreundliche Benutzeroberfläche oder die Migration zu serverlosen Umgebungen zur Skalierbarkeit umfassen.
Q&A Highlights
Was ist der Zweck des Bulk Asynchronous Recipient Validation Tool?
Es überprüft große Mengen von E-Mail-Adressen, indem es direkt mit Bird’s Recipient Validation API integriert wird und schnell verifizierte Ergebnisse ausgibt, ohne manuelle Uploads.
Warum wurde Python zunächst verwendet und später durch Node.js ersetzt?
Der Global Interpreter Lock (GIL) von Python begrenzte die Parallelität, während Node.js echte asynchrone Ausführung ermöglichte, was zu deutlich schnelleren parallelen API-Aufrufen führte.
Wie verarbeitet das Tool große Dateien, ohne den Speicher zu überlasten?
Statt alle Daten auf einmal zu laden, verarbeitet das Skript jede CSV-Zeile einzeln—sendet die Validierungsanfrage und schreibt die Ergebnisse sofort in eine neue CSV-Datei.
Welches Problem löst das Tool für Entwickler?
Es ermöglicht die Validierung von E-Mail-Listen in großem Maßstab, wobei die 20MB-Grenze des SparkPost’s UI-basierten Validators überschritten und die Notwendigkeit, mehrere Dateien manuell hochzuladen, beseitigt wird.
Wie schnell ist die endgültige Version des Programms?
Rund 100.000 Validierungen abgeschlossen in 55 Sekunden, verglichen mit über einer Minute bei Verwendung der UI-Version.
Welche Probleme traten auf Windows-Systemen auf?
Node.js HTTP-Client-Verbindungs-Pooling verursachte „ENOBUFS“-Fehler nach vielen gleichzeitigen Anfragen, die durch das Konfigurieren der Axios-Verbindungswiederverwendung behoben wurden.
Welche zukünftigen Verbesserungen werden vorgeschlagen?
Fehlerbehandlung und Wiederholungen hinzufügen, eine Front-End-Schnittstelle erstellen oder das Tool als serverlose Azure-Funktion implementieren, um bessere Skalierbarkeit und Belastbarkeit zu erreichen.
Für jemanden, der nach einem einfachen, schnellen Programm sucht, das eine CSV-Datei einliest, die Empfänger-Validierungs-API aufruft und eine CSV-Datei ausgibt, ist dieses Programm genau das Richtige für Sie.
Beim Erstellen von E-Mail-Anwendungen müssen Entwickler oft mehrere Dienste und APIs integrieren. Das Verständnis der E-Mail-API-Grundlagen in der Cloud-Infrastruktur bietet die Grundlage für den Aufbau robuster Tools wie das Massenevalidierungssystem, das wir in diesem Leitfaden erstellen werden.
Eine der Fragen, die wir gelegentlich erhalten, ist, wie kann ich E-Mail-Listen mit Empfängervalidierung massenhaft validieren? Es gibt hier zwei Optionen: Eine besteht darin, eine Datei über die SparkPost UI zur Validierung hochzuladen, und die andere besteht darin, einzelne Anrufe pro E-Mail an die API zu machen (da die API die Validierung einer einzelnen E-Mail ermöglicht).
Die erste Option funktioniert großartig, hat jedoch eine Begrenzung von 20 MB (etwa 500.000 Adressen). Was ist, wenn jemand eine E-Mail-Liste mit Millionen von Adressen hat? Das könnte bedeuten, dass man diese in 1.000 CSV-Datei-Uploads aufteilen muss.
Da das Hochladen von Tausenden von CSV-Dateien etwas übertrieben erscheint, habe ich diesen Anwendungsfall genommen und begann mich zu fragen, wie schnell ich die API zum Laufen bringen könnte. In diesem Blogbeitrag werde ich erklären, was ich versucht habe und wie ich schließlich zu einem Programm gekommen bin, das rund 100.000 Validierungen in 55 Sekunden durchführen konnte (während ich in der UI etwa 100.000 Validierungen in 1 Minute und 10 Sekunden geschafft habe).
Ansatz | Getestete Validierungen | Zeit zum Abschluss | Ungefährer Durchsatz |
|---|---|---|---|
Bulk-Async-Node.js-Tool | 100,000 | 55 Sekunden | ~1.818 Validierungen/Sekunde |
SparkPost UI-Upload | 100,000 | 1 Min 10 Sek | ~1.428 Validierungen/Sekunde |
Und obwohl dies immer noch etwa 100 Stunden dauern würde, um etwa 654 Millionen Validierungen abzuschließen, kann dieses Skript im Hintergrund laufen und erhebliche Zeit sparen.
Die endgültige Version dieses Programms ist hier zu finden.
Mein erster Fehler: die Verwendung von Python
Mein zweiter Fehler: der Versuch, die Datei in den Speicher zu lesen
Meine anfängliche Idee war wie folgt:

Zuerst eine CSV-Liste von E-Mails einlesen. Zweitens, laden Sie die E-Mails in ein Array und prüfen Sie, ob sie im richtigen Format sind. Drittens, asynchron die Empfängerüberprüfungs-API aufrufen. Viertens, auf die Ergebnisse warten und sie in eine Variable laden. Und schließlich, diese Variable in eine CSV-Datei ausgeben.
Dies funktionierte sehr gut für kleinere Dateien. Das Problem trat auf, als ich versuchte, 100.000 E-Mails durchzuführen. Das Programm blieb bei etwa 12.000 Validierungen hängen. Mit Hilfe eines unserer Frontend-Entwickler sah ich, dass das Problem darin bestand, alle Ergebnisse in eine Variable zu laden (und daher schnell den Speicher zu erschöpfen). Wenn Sie die erste Version dieses Programms sehen möchten, habe ich sie hier verlinkt: Version 1 (NICHT EMPFOHLEN).

Zuerst eine CSV-Liste von E-Mails einlesen. Zweitens, zählen Sie die Anzahl der E-Mails in der Datei zu Berichtszwecken. Drittens, während jede Zeile asynchron gelesen wird, die Empfängerüberprüfungs-API aufrufen und die Ergebnisse in eine CSV-Datei ausgeben.
So rufe ich für jede gelesene Zeile die API auf und schreibe die Ergebnisse asynchron aus, um diese Daten nicht im Langzeitspeicher zu behalten. Ich habe auch die Syntaxüberprüfung der E-Mail entfernt, nachdem ich mit dem Empfängerüberprüfungsteam gesprochen habe, da sie mir mitteilten, dass die Empfängerüberprüfung bereits über Prüfungen verfügt, um zu überprüfen, ob eine E-Mail gültig ist oder nicht.
Aufschlüsselung des finalen Codes
Nächste Schritte
Für jemanden, der nach einem einfachen, schnellen Programm sucht, das eine CSV einliest, die Empfänger-Validation API aufruft und eine CSV ausgibt, ist dieses Programm genau das Richtige.
Einige Ergänzungen zu diesem Programm wären folgende:
Erstellen Sie eine Benutzeroberfläche oder ein Frontend für die einfachere Nutzung
Bessere Fehlerbehandlung und erneute Versuche, da das Programm derzeit den Aufruf nicht wiederholt, falls die API aus irgendeinem Grund einen Fehler ausgibt
Erwägen Sie die Implementierung als eine serverlose Azure-Funktion für automatisches Skalieren und reduzierte Infrastrukturverwaltung
Ich wäre auch neugierig zu sehen, ob schnellere Ergebnisse mit einer anderen Sprache wie Golang oder Erlang/Elixir erzielt werden könnten. Neben der Sprachwahl können auch Infrastrukturbeschränkungen die Leistung beeinflussen - das haben wir aus erster Hand erfahren, als wir auf undokumentierte DNS-Limits in AWS stießen, die unsere hochvolumigen E-Mail-Verarbeitungssysteme beeinträchtigten.
Für Entwickler, die daran interessiert sind, API-Verarbeitung mit visuellen Workflow-Tools zu kombinieren, sehen Sie sich an, wie Sie Flow Builder mit Google Cloud Functions integrieren können, um No-Code-Automationsworkflows zu realisieren.
Bitte zögern Sie nicht, mir Feedback oder Vorschläge zur Erweiterung dieses Projekts zu geben.



