Een Bulk Asynchroon Bird Ontvanger Validatie Tool Bouwen
·
26 mei 2022

Belangrijkste punten
De auteur bouwde een bulkontvanger validatietool om miljoenen e-mailadressen efficiënt te valideren met behulp van Bird’s Recipient Validation API.
Node.js bleek sneller en beter schaalbaar dan Python vanwege zijn non-blocking I/O en het ontbreken van GIL-beperkingen.
De tool leest CSV-bestanden asynchroon, roept de validatie-API aan voor elke e-mail, en schrijft resultaten in realtime naar een nieuwe CSV.
De aanpak vermijdt geheugenknelpunten en verbetert de doorvoer naar ongeveer 100.000 validaties in minder dan een minuut.
Toekomstige verbeteringen kunnen beter retry-afhandeling, een gebruiksvriendelijke UI, of migratie naar serverloze omgevingen voor schaalbaarheid omvatten.
Q&A Hoogtepunten
Wat is het doel van de Bulk Asynchronous Recipient Validation Tool?
Het valideert grote hoeveelheden e-mailadressen door direct te integreren met Bird’s Recipient Validation API, waardoor geverifieerde resultaten snel worden geleverd zonder handmatige uploads.
Waarom werd Python aanvankelijk gebruikt en later vervangen door Node.js?
Python's Global Interpreter Lock (GIL) beperkte concurrentie, terwijl Node.js echte asynchrone uitvoering toestond, resulterend in veel snellere parallelle API-aanroepen.
Hoe gaat de tool om met grote bestanden zonder dat het geheugen opraakt?
In plaats van alle gegevens in één keer te laden, verwerkt het script elke CSV-regel afzonderlijk—stuurt het de validatie-aanvraag en schrijft onmiddellijk resultaten naar een nieuw CSV-bestand.
Welk probleem lost de tool op voor developers?
Het maakt e-mail lijstvalidatie op grote schaal mogelijk, waardoor de 20MB-limiet van SparkPost’s UI-gebaseerde validator wordt overwonnen en de noodzaak om meerdere bestanden handmatig te uploaden wordt geëlimineerd.
Hoe snel is de definitieve versie van het programma?
Ongeveer 100.000 validaties voltooid in 55 seconden, vergeleken met meer dan een minuut met de UI-versie.
Met welke problemen werd er op Windows-systemen geconfronteerd?
Node.js HTTP client verbinding pooling veroorzaakte “ENOBUFS” fouten na veel gelijktijdige verzoeken, die werden opgelost door axios verbinding hergebruik te configureren.
Welke toekomstige verbeteringen worden voorgesteld?
Foutafhandeling en herhalingen toevoegen, een front-end interface creëren, of de tool implementeren als een serverloze Azure Function voor betere schaalbaarheid en veerkracht.
Voor iemand die op zoek is naar een eenvoudig en snel programma dat een csv-bestand verwerkt, de ontvanger-validatie API aanroept en een CSV oplevert, is dit programma voor jou.
Bij het bouwen van e-mailtoepassingen, moeten ontwikkelaars vaak meerdere diensten en API's integreren. Inzicht in e-mail API-grondbeginselen in cloudinfrastructuur biedt de basis voor het bouwen van robuuste tools zoals het bulkvalidatiesysteem dat we in deze gids zullen maken.
Een van de vragen die we af en toe ontvangen is, hoe kan ik e-maillijsten in bulk valideren met ontvangersvalidatie? Er zijn hier twee opties: een bestand uploaden via de SparkPost UI voor validatie, en de andere is om individuele oproepen per e-mail naar de API te maken (aangezien de API een enkele e-mailvalidatie is).
De eerste optie werkt uitstekend, maar heeft een limiet van 20Mb (ongeveer 500.000 adressen). Wat als iemand een e-maillijst heeft met miljoenen adressen? Het zou kunnen betekenen dat je dat moet opsplitsen in duizenden CSV-bestandsuploads.
Aangezien het uploaden van duizenden CSV-bestanden enigszins vergezocht lijkt, nam ik die use-case en begon ik me af te vragen hoe snel ik de API kon laten draaien. In deze blogpost zal ik uitleggen wat ik heb geprobeerd en hoe ik uiteindelijk tot een programma kwam dat ongeveer 100.000 validaties in 55 seconden kon krijgen (terwijl ik in de UI ongeveer 100.000 validaties in 1 minuut en 10 seconden kreeg).
Benadering | Geteste Validaties | Tijd om te Voltooien | Geschatte Doorvoer |
|---|---|---|---|
Bulk asynchrone Node.js-tool | 100.000 | 55 seconden | ~1.818 validaties/sec |
SparkPost UI upload | 100.000 | 1 min 10 sec | ~1.428 validaties/sec |
En hoewel dit nog steeds ongeveer 100 uur zou duren om met ongeveer 654 miljoen validaties gedaan te worden, kan dit script op de achtergrond draaien en zo aanzienlijke tijd besparen.
De uiteindelijke versie van dit programma is te vinden hier.
Mijn eerste fout: het gebruik van Python
Mijn tweede fout: proberen het bestand in het geheugen te lezen
Mijn oorspronkelijke idee was als volgt:

Eerst een CSV-lijst met e-mails inlezen. Ten tweede de e-mails in een array laden en controleren of ze in het juiste formaat zijn. Ten derde de ontvanger-validatie-API asynchroon aanroepen. Ten vierde wachten op de resultaten en deze in een variabele laden. En ten slotte deze variabele naar een CSV-bestand uitvoeren.
Dit werkte erg goed voor kleinere bestanden. Het probleem ontstond toen ik 100.000 e-mails probeerde te verwerken. Het programma liep vast bij ongeveer 12.000 validaties. Met de hulp van een van onze front-end ontwikkelaars ontdekte ik dat het probleem lag bij het laden van alle resultaten in een variabele (en dus snel zonder geheugen kwam te zitten). Als je de eerste iteratie van dit programma wilt zien, heb ik deze hier gelinkt: Version 1 (NOT RECOMMENDED).

Eerst een CSV-lijst met e-mails inlezen. Ten tweede het aantal e-mails in het bestand tellen voor rapportagedoeleinden. Ten derde, terwijl elke regel asynchroon wordt gelezen, de ontvanger-validatie-API aanroepen en de resultaten naar een CSV-bestand uitvoeren.
Dus, voor elke ingelezen regel roep ik de API aan en schrijf ik de resultaten asynchroon weg om geen van deze gegevens in het langetermijngeheugen te bewaren. Ik heb ook de e-mailsyntaxcontrole verwijderd na overleg met het ontvanger-validatieteam, aangezien ze me vertelden dat ontvanger-validatie al ingebouwde controles heeft om te controleren of een e-mail geldig is of niet.
Het uiteindelijke code ontleden
Volgende Stappen
Voor iemand die op zoek is naar een eenvoudig snel programma dat een csv als invoer neemt, de ontvangersvalidatie-API aanroept en een CSV uitvoert, is dit programma voor jou.
Enkele aanvullingen op dit programma zouden het volgende zijn:
Bouw een front-end of eenvoudigere UI voor gebruik
Beter fout- en retrybeheer omdat het programma momenteel de oproep niet opnieuw uitvoert als de API om een of andere reden een fout geeft
Overweeg implementatie als een serverless Azure Function voor automatische schaalvergroting en verminderd infrastructuurbeheer
Ik ben ook benieuwd of snellere resultaten zouden kunnen worden bereikt met een andere taal, zoals Golang of Erlang/Elixir. Buiten de taalkeuze kunnen infrastructuurbeperkingen ook de prestaties beïnvloeden - dit hebben we uit de eerste hand geleerd toen we ongedocumenteerde DNS-beperkingen in AWS tegenkwamen die onze systemen voor het verwerken van e-mails met een hoog volume beïnvloedden.
Voor ontwikkelaars die geïnteresseerd zijn in het combineren van API-verwerking met visuele workflowtools, bekijk hoe u Flow Builder kunt integreren met Google Cloud Functions voor no-code automatiseringsworkflows.
Voel je vrij om mij feedback of suggesties te geven voor het uitbreiden van dit project.



