Wanneer je met Python met API's werkt om gegevens in databases op te nemen, zijn efficiëntie en betrouwbaarheid van groot belang. API's zijn vaak buiten je controle, je bent afhankelijk van hun uptime, snelheidslimieten en datastructuren. Dat betekent dat je ingestion pipelines veerkrachtig moeten zijn tegen storingen. In deze blog deel ik drie tips om veerkrachtigere en efficiëntere ingestion pipelines te maken.
Als een API-aanroep mislukt, retourneren programma's vaak direct een foutmelding of maken ze een eenvoudige lus met n herhalingen. Dit resulteert in meer handmatige interventie door de ontwikkelaar dan nodig is. Het implementeren van een goed retry beleid vermindert het aantal mislukkingen van je programma. Dit kan worden bereikt door een pakket zoals tenacity in Python te gebruiken. Met de decorator @retry kun je je functie (API-aanroep) opnieuw proberen. Het heeft de volgende handige functies:
API's gebruiken vaak paginering wanneer gegevens te groot zijn of voor efficiëntere netwerken. Meestal wordt dit geïmplementeerd door simpelweg over de pagina's te lussen en elke pagina op te halen. Wanneer er honderden pagina's zijn, is dit erg inefficiënt. Aangezien je op elk antwoord wacht voordat je de volgende verstuurt , is een veel snellere aanpak om gelijktijdige verzoeken te doen met asyncio. Hiermee kun je alle verzoeken tegelijkertijd versturen en alle antwoorden tegelijkertijd verzamelen. Dit vermindert de wachttijd van het programma aanzienlijk. Voor een van mijn ingestion pipelines is de runtime teruggebracht van 30 minuten naar 5 minuten! Dit is vooral belangrijk als je script dure cloudresources gebruikt.
Pas echter op met het verzenden van te veel verzoeken tegelijk, je zou de aanvraaglimiet van de API kunnen overschrijden en geblokkeerd worden!
Wanneer je API data in een database invoert, is de manier waarop je inserts afhandelt net zo belangrijk als het ophalen van de data. Een veelgemaakte fout is om alle data in één keer in de database te schrijven. Je applicatie gebruikt dan te veel geheugen en je hebt kans dat je de database ingestion tool overbelast. In plaats daarvan kun je beter batchgewijs invoegen. Dit werkt door een beheersbaar aantal rijen (een paar duizend) tegelijk in te voegen. Het verbetert de doorvoer en vermindert de belasting van zowel je applicatie als de database. Ten slotte zorgt het combineren van batching met retry logica ervoor dat zelfs als het schrijven van een batch mislukt, je niet de hele ingestion taak verliest, alleen de betreffende batch wordt opnieuw geprobeerd.