Antwoorden>Meer informatie over blockchain-datastreaming>Polling versus streaming van blockchain-gegevens
Het ophalen versus het streamen van blockchain-gegevens
// Tags
polling versus streaming WebSocket-blockchain
TL;DR: Polling is een op ‘pull’ gebaseerd patroon waarbij je applicatie herhaaldelijk en met vaste tussenpozen een blockchain-node om nieuwe gegevens vraagt. Streaming is een op ‘push’ gebaseerd patroon waarbij nieuwe gegevens automatisch aan je applicatie worden geleverd zodra ze op de blockchain worden geproduceerd. Polling is eenvoudig te implementeren, maar verspilt resources, veroorzaakt vertraging en brengt het risico met zich mee dat gegevens ontbreken. Streaming is efficiënter, sneller en betrouwbaarder op grote schaal, maar vereist een andere infrastructuur. Voor de meeste blockchain-toepassingen in productie is streaming de betere aanpak voor het opnemen van gegevens.
De eenvoudige uitleg
Elke blockchain-toepassing moet weten wanneer er iets op de blockchain gebeurt. Een wallet moet weten wanneer de gebruiker een overschrijving ontvangt. Een DeFi-protocol moet detecteren wanneer een prijsorakel wordt bijgewerkt. Een handelsbot moet nieuwe transacties zien op het moment dat ze in een blok worden opgenomen. Een analyseplatform moet elk blok verwerken zodra het wordt geproduceerd. De vraag is hoe jouw toepassing op de hoogte raakt van deze gebeurtenissen.
Bij polling doorloopt je applicatie een lus: het endpoint aanroepen, controleren of er iets nieuws is gebeurd, eventuele nieuwe gegevens verwerken, een vast interval afwachten, herhalen. Dit is het patroon dat de meeste ontwikkelaars als eerste leren, omdat het op natuurlijke wijze aansluit bij de werking van HTTP-API’s. Stel een timer in, verstuur elke N seconden een verzoek en verwerk het antwoord. Hiervoor is geen speciale infrastructuur nodig, behalve de mogelijkheid om HTTP-verzoeken te versturen.
Bij streaming opent je applicatie één keer een verbinding of stelt deze één keer een datapijplijn in, waarna nieuwe gegevens automatisch binnenkomen. Er is geen lus, geen timer en geen herhaalde verzoeken. Wanneer er een nieuw blok wordt geproduceerd, stromen de gegevens naar je applicatie zonder dat je applicatie erom hoeft te vragen. De taak van de applicatie is simpelweg het verwerken van binnenkomende gegevens zodra deze binnenkomen.
Hoe opiniepeilingen in de praktijk werken
Een typische polling-implementatie voor het monitoren van nieuwe blokken ziet er als volgt uit: je applicatie roept „eth_blockNumber“ aan om het nieuwste blok op te halen, vergelijkt dit met het laatste blok dat het heeft verwerkt, haalt eventuele nieuwe blokken op via „eth_getBlockByNumber“, haalt de benodigde gegevens eruit en plant de volgende polling in. Elke iteratie vereist minimaal één RPC-aanroep (om het laatste bloknummer te controleren) en mogelijk nog veel meer (om de volledige blokgegevens, transactiebewijzen en gebeurtenislogboeken voor elk nieuw blok op te halen).
Het polling-interval is een cruciale ontwerpbeslissing. Als je te vaak pollt, verspil je RPC-verzoeken (en credits) door te vragen „is er iets nieuws?”, terwijl het antwoord „nee” is. Op Ethereum, waar elke 12 seconden een blok wordt geproduceerd, betekent pollen elke seconde dat 11 van de 12 verzoeken niets nuttigs opleveren. Als je te zelden pollt, ontstaat er vertraging. Als je interval 30 seconden is, ontdek je een nieuw blok mogelijk pas 30 seconden nadat het is geproduceerd. Je verwerkt mogelijk ook meerdere blokken per interval, wat een ongelijkmatige belasting van je systeem veroorzaakt.
Polling brengt verschillende betrouwbaarheidsrisico’s met zich mee. Als een poll mislukt vanwege een netwerkfout, een rate limit of een probleem met een node, kan je applicatie een blok volledig missen, tenzij deze het nummer van het laatst verwerkte blok bijhoudt en bij de volgende succesvolle poll teruggaat naar dat punt. Als uw applicatie crasht of opnieuw opstart, moet deze vaststellen waar het was gebleven en vanaf dat punt verdergaan, waarbij alle blokken die tijdens de uitval zijn geproduceerd, moeten worden verwerkt. Als de polling-worker achterop raakt door verwerkingsvertragingen, wordt de kloof tussen het einde van de keten en de status van uw applicatie groter, en om deze achterstand in te halen moet een achterstand aan blokken worden verwerkt.
Op ketens met een hoge doorvoercapaciteit wordt het opvragen van gegevens bijzonder problematisch. Solana slots om de 400 ms. Arbitrum Base blokken om de 250 ms. Om deze ketens op hun blokproductiesnelheid te pollen, zijn 2 tot 4 RPC-verzoeken per seconde nodig, alleen al voor het controleren van bloknummers, plus extra verzoeken voor volledige blokgegevens. Bij schaalvergroting over meerdere ketens neemt het volume (en de kosten) van RPC-verzoeken lineair toe met het aantal ketens en de blokproductiesnelheid van elke keten.
Hoe streaming in de praktijk werkt
WebSocket-abonnementen zijn de eenvoudigste vorm van blockchain-streaming. Je applicatie opent een permanente WebSocket-verbinding met een node en verstuurt een abonnementsverzoek (zoals „eth_subscribe” met „newHeads”). De node stuurt elke nieuwe blokheader via de open verbinding naar je applicatie zodra deze is gegenereerd. Geen polling, geen verspilde verzoeken, geen vertraging.
WebSockets werken goed voor eenvoudige toepassingen, maar hebben aanzienlijke beperkingen bij grootschalig gebruik. Verbindingen zijn stateful en kunnen worden verbroken als gevolg van netwerkproblemen, het opnieuw opstarten van servers of time-outs bij inactiviteit. Wanneer een verbinding wordt verbroken, mist je applicatie alle gebeurtenissen die plaatsvinden vóór het opnieuw tot stand brengen van de verbinding, en moet deze de verbroken verbinding detecteren, opnieuw verbinding maken en de gemiste gegevens aanvullen. Het beheren van meerdere gelijktijdige WebSocket-verbindingen over meerdere ketens heen maakt het geheel nog complexer. WebSocket-abonnementen ondersteunen bovendien geen historische gegevens. Als u blokken van vorige week moet verwerken, bieden WebSockets geen uitkomst.
Speciaal voor dit doel ontwikkelde streamingdiensten bieden een oplossing voor deze beperkingen. In plaats van kwetsbare WebSocket-verbindingen in stand te houden, configureert uw applicatie een datapijplijn die de streamingdienst van begin tot eind beheert. De dienst maakt verbinding met blockchain-knooppunten, verwerkt elk blok, past uw filters toe en levert de resultaten aan uw bestemming met gegarandeerde levering. Als uw bestemming tijdelijk niet beschikbaar is, slaat de dienst de gegevens op in de buffer en probeert het opnieuw. Als er een reorganisatie plaatsvindt, verstuurt de dienst corrigerende payloads. Als u historische gegevens nodig hebt, kan dezelfde pijplijn gegevens vanaf elk willekeurig startblok achteraf invullen.
Een vergelijking van de twee benaderingen
De latentie is het meest opvallende verschil. Bij polling is de latentie in het beste geval altijd gelijk aan het polling-interval, maar in de praktijk is deze langer vanwege de verwerkingstijd en het herstellen van fouten. Bij streaming worden gegevens geleverd zodra ze beschikbaar zijn, doorgaans binnen enkele seconden nadat een blok is geproduceerd. Voor toepassingen waarbij latentie een belangrijke rol speelt, zoals handelsbots of realtime dashboards, is streaming aanzienlijk sneller.
Het tweede belangrijke verschil betreft de efficiëntie van het gebruik van resources. Bij polling wordt een verzoekvolume gegenereerd dat evenredig is aan de pollingfrequentie, ongeacht of er nieuwe gegevens beschikbaar zijn. Een polling-worker die elke seconde controleert op nieuwe blokken, voert 86.400 verzoeken per dag uit, zelfs als deze alleen geïnteresseerd is in één specifieke gebeurtenis die één keer per week plaatsvindt. Bij streaming worden resources verbruikt in verhouding tot het daadwerkelijke gegevensvolume. Als er niets gebeurt dat aan uw filtercriteria voldoet, wordt er niets geleverd en worden er aan uw kant geen resources verbruikt.
Op grote schaal is betrouwbaarheid het belangrijkste verschil tussen beide benaderingen. Bij polling moet je applicatie zelf zorgen voor het bijhouden van de status, het detecteren van hiaten, het herstellen van fouten en de inhaal-logica. Elk randgeval (gemiste blokken, dubbele verwerking, reorganisaties, snelheidsbeperkingen, failovers van knooppunten) moet in je code worden afgehandeld. Streamingdiensten behandelen deze randgevallen aan de kant van de aanbieder en leveren een hiatenloze, geordende en ontdubbelde feed die je applicatie kan verwerken zonder dat je je zorgen hoeft te maken over de betrouwbaarheid van de infrastructuur.
Complexiteit is de afweging. Polling is in eerste instantie eenvoudiger te implementeren. Een eenvoudige polling-lus kan in 20 regels code worden geschreven. Maar die eenvoud is bedrieglijk, want polling die geschikt is voor productieomgevingen vereist foutafhandeling, backoff-logica, statusbeheer, detectie van reorganisaties en monitoring, wat kan oplopen tot honderden regels. Streaming vereist voorafgaande configuratie van een datapijplijn en een doelsysteem dat gepushte gegevens kan ontvangen (zoals een webhook-server of een database met de juiste invoerlogica), maar eenmaal geconfigureerd vereist het veel minder doorlopend onderhoud.
Wat is het verschil tussen polling en streaming?
Polling en streaming lossen hetzelfde probleem op, namelijk het binnenhalen van actuele on-chain-gegevens in je applicatie, maar ze keren de flow om. Bij polling is je code de actieve partij: deze roept herhaaldelijk een endpoint aan en vraagt of er iets is veranderd. Bij streaming is de aanbieder de actieve partij, die elk nieuw blok of elke bijbehorende gebeurtenis naar je pusht op het moment dat deze wordt geproduceerd. In de onderstaande tabel worden de twee patronen vergeleken op de aspecten die in de productie het belangrijkst zijn.
Afmeting
Enquête
Streaming
Gegevens flow
Op basis van pull-verzoeken vraagt je app gegevens op
Op push-basis; gegevens worden automatisch verzonden
Latentie
Gelijk aan het peilinginterval of langer
Binnen enkele seconden na het vormen van het blok
Gebruik van hulpbronnen
Evenredig aan de peilingfrequentie, zelfs in ruststand
In verhouding tot het werkelijke gegevensvolume
Betrouwbaarheid op grote schaal
Je app kan omgaan met onderbrekingen, herhalingspogingen en reorganisaties
De aanbieder levert een geordende, ontdubbelde feed
Historische gegevens
Ondersteund door eerdere blokken opnieuw op te vragen
Ondersteund door het opnieuw vullen van dezelfde pijpleiding
Complexiteit van de installatie
Eenvoudig om mee te beginnen, maar kostbaar om te beveiligen
Eenmalige configuratie, weinig onderhoud op de lange termijn
Het meest geschikt voor
Eenvoudige scripts en controles die niet vaak plaatsvinden
Realtime-apps en ketens met hoge doorvoercapaciteit
Hoe kies je een peilinginterval?
Als je een poll uitvoert, moet de interval overeenkomen met de bloktijd van de keten die je leest. Als je veel sneller pollt dan er blokken worden geproduceerd, verspil je verzoeken en kan dit leiden tot rate limiting, terwijl pollen dat veel langzamer is dan de bloktijd onnodige vertraging veroorzaakt en je worker dwingt om meerdere blokken tegelijk te verwerken. In de onderstaande tabel staan de gebruikelijke bloktijden en de praktische gevolgen daarvan voor de pollingfrequentie per netwerk.
Blockchain
Geschatte blokduur
Gevolgen voor de peilingen
Bitcoin
Ongeveer 10 minuten
Een pauze van 1 tot 2 minuten is ruim voldoende
Ethereum
Ongeveer 12 seconden
Elke 4 tot 12 seconden controleren om up-to-date te blijven zonder verspilling
BNB Smart Chain
Ongeveer 3 seconden
Het pollen van subblokken zorgt voor extra belasting zonder dat dit veel voordelen oplevert
Base
Ongeveer 250 ms
Het bijhouden van de peilingen verloopt niet soepel; ik geef de voorkeur aan livestreaming
Solana
Ongeveer 400 ms
Groot aantal verzoeken; streaming heeft sterk de voorkeur
Wanneer moet je polling nog steeds gebruiken?
Streaming is voor de meeste productiewerkzaamheden de betere standaardoptie, maar polling blijft in enkele gevallen een redelijke keuze. Eenmalige scripts, backfills en onregelmatige batchtaken rechtvaardigen zelden een beheerde pijplijn. Polling is ook prima wanneer u slechts één waarde op verzoek nodig hebt, zoals een saldo-controle vóór een gebruikersactie, waarbij er geen continue feed is waarop u zich kunt abonneren. Wanneer actualiteit en volume echter wel van belang zijn, verschuiven de afwegingen snel, dus is het nuttig om het verschil tussen realtime- en historische gegevens te begrijpen voordat u een aanpak kiest.
Hoe gaat streaming om met reorganisaties en verloren gegane gegevens?
Het moeilijkste aan het verwerken van live blockchain-gegevens is niet het ‘happy path’, maar juist de randgevallen. Door een reorganisatie van de blockchain kan een blok worden vervangen dat je applicatie al had verwerkt, en een verbroken verbinding kan een gat in je gegevens veroorzaken. Bij ‘raw polling’ of WebSockets moet je deze situaties zelf opsporen en verhelpen. Een beheerde dienst zoals Quicknode Streams neemt dit voor je uit handen: de dienst levert gegevens in definitieve volgorde, verstuurt correctie-payloads wanneer er een reorganisatie plaatsvindt, en buffert en probeert het opnieuw wanneer je bestemming niet beschikbaar is. Dat verschil maakt push-gebaseerde levering zo veel eenvoudiger om op schaal te beheren.
Veelgestelde vragen
Is streaming altijd beter dan peilingen?
Niet altijd. Voor de meeste productietoepassingen die continu gegevens met een lage latentie nodig hebben, scoort streaming beter op het gebied van efficiëntie en betrouwbaarheid. Maar voor eenmalige scripts, eenvoudige saldocontroles of taken die niet vaak worden uitgevoerd, is polling volkomen toereikend en eenvoudiger in te stellen. De juiste keuze hangt af van hoe actueel je gegevens moeten zijn en hoeveel volume je verwerkt. Voor een inleiding op het push-gebaseerde model kun je lezen wat blockchain-datastreaming is.
Hoe vaak moet ik een endpoint opvragen?
Stem je polling-interval af op de bloktijd van de blockchain. Op Ethereum blijf je met een polling-interval van 4 tot 12 seconden up-to-date zonder onnodige verzoeken te versturen. Op snelle blockchains zoals Solana Base is polling met de blokfrequentie onpraktisch en is streaming een betere keuze. Als je veel sneller pollt dan er blokken worden geproduceerd, levert dat meestal geen nieuwe gegevens op en verspil je je verzoekbudget. Bekijk hoe RPC-verzoeken werken om te zien wat er bij elk verzoek komt kijken.
Is polling duurder dan streaming?
Op grote schaal is dat vaak het geval. Bij polling worden verzoeken volgens een vast schema verzonden, ongeacht of er nieuwe gegevens beschikbaar zijn of niet. Daardoor kan een drukbezette polling-worker tienduizenden verzoeken per dag versturen om slechts een handvol gebeurtenissen vast te leggen. Bij streaming worden resources verbruikt in verhouding tot de gegevens die daadwerkelijk aan je filters voldoen, wat doorgaans leidt tot minder verspilde verzoeken en lagere kosten voor continue workloads.
Wat gebeurt er met mijn gegevens tijdens een reorganisatie?
Bij naïeve polling of onbewerkte WebSockets kan een reorganisatie ertoe leiden dat je applicatie transacties vasthoudt die niet langer op de canonieke keten bestaan. Een beheerde streamingdienst detecteert de reorganisatie en verstuurt correctiegegevens, zodat je status consistent blijft. Inzicht in de verhouding tussen doorvoer en latentie helpt je ook bij het bepalen hoe lang je moet wachten voordat je gegevens als afgewikkeld beschouwt.
Kan ik historische gegevens opvragen bij een streamingdienst?
Ja. In tegenstelling tot WebSocket-abonnementen, die pas vanaf het moment dat je verbinding maakt nieuwe gebeurtenissen doorgeven, kan een volledige streamingpijplijn met dezelfde configuratie gegevens uit elk eerder blok alsnog doorgeven. Hierdoor kun je de geschiedenis opnieuw afspelen en vervolgens naadloos overschakelen naar livegegevens, zonder dat je twee afzonderlijke systemen hoeft te draaien.
Hoe Quicknode beide patronen Quicknode
De Core API Quicknode ondersteunt zowel polling via HTTP RPC-eindpunten als realtime-abonnementen via WebSocket-verbindingen voor alle ondersteunde blockchains. Voor applicaties die gebruikmaken van polling biedt de handleiding Quicknode voor efficiënte RPC-verzoeken best practices voor het minimaliseren van onnodige verzoeken, het implementeren van een goede foutafhandeling en het beheren van verzoeklimieten.
Voor applicaties die klaar zijn om verder te gaan dan polling,Streams Quicknode Streams een volledig beheerde streamingpijplijn. Streams realtime blockchain-gegevens met gegarandeerde levering, verwerking in definitieve volgorde, automatische afhandeling van reorganisaties en filtering aan de serverzijde, zonder dat uw applicatie WebSocket-verbindingen of polling-infrastructuur hoeft te onderhouden. Streams levering aan webhooks, PostgreSQL, Snowflake, Amazon S3, Azure Storage en meer, waardoor het aanpasbaar is aan elke backend-architectuur. In de documentatie Quicknode Streams een gids beschikbaar met een directe vergelijking tussen WebSocket-abonnementen en Streams , waarin de voor- en nadelen en het migratietraject worden behandeld voor teams die overstappen van polling- of op WebSocket gebaseerde architecturen.