Réponses>En savoir plus sur le streaming de données blockchain>Sondage ou diffusion en continu des données de la blockchain
Collecte de données blockchain par interrogation ou en continu
// Tags
Polling vs streaming WebSocket et blockchain
En bref : le polling est un modèle de type « pull » dans lequel votre application interroge de manière répétée un nœud de la blockchain pour obtenir de nouvelles données à intervalles réguliers. Le streaming est un modèle de type « push » dans lequel les nouvelles données sont transmises automatiquement à votre application dès leur production sur la blockchain. Le polling est simple à mettre en œuvre, mais il gaspille des ressources, introduit une latence et comporte un risque de perte de données. Le streaming est plus efficace, plus rapide et plus fiable à grande échelle, mais nécessite une infrastructure différente. Pour la plupart des applications blockchain en production, le streaming constitue la meilleure approche pour l’ingestion de données.
L'explication simple
Toute application blockchain doit savoir quand un événement se produit sur la chaîne. Un portefeuille doit savoir quand son utilisateur reçoit un virement. Un protocole DeFi doit détecter quand un oracle de prix est mis à jour. Un bot de trading doit repérer les nouvelles transactions dès leur intégration dans un bloc. Une plateforme d'analyse doit traiter chaque bloc au fur et à mesure de sa création. La question est de savoir comment votre application prend connaissance de ces événements.
Avec le polling, votre application exécute une boucle : elle appelle l'endpoint RPC, vérifie s'il y a eu des changements, traite les nouvelles données, attend un intervalle défini, puis recommence. C'est le modèle que la plupart des développeurs apprennent en premier, car il correspond naturellement au fonctionnement des API HTTP. Il suffit de configurer un minuteur, d'envoyer une requête toutes les N secondes et de traiter la réponse. Cela ne nécessite aucune infrastructure particulière, hormis la capacité à effectuer des requêtes HTTP.
Avec le streaming, votre application établit une connexion ou configure un pipeline de données une seule fois, puis les nouvelles données arrivent automatiquement. Il n'y a ni boucle, ni minuterie, ni requêtes répétées. Lorsqu'un nouveau bloc est généré, les données sont transmises à votre application sans que celle-ci ait à les demander. Le rôle de l'application consiste simplement à traiter les données entrantes au fur et à mesure de leur arrivée.
Comment fonctionne le sondage dans la pratique ?
Une implémentation typique de l'interrogation pour surveiller les nouveaux blocs se présente comme suit : votre application appelle « eth_blockNumber » pour obtenir le dernier bloc, le compare au dernier bloc qu'elle a traité, récupère les nouveaux blocs via « eth_getBlockByNumber », extrait les données dont elle a besoin et planifie la prochaine interrogation. Chaque itération nécessite au minimum un appel RPC (pour vérifier le numéro du dernier bloc) et potentiellement bien d’autres (pour récupérer les données complètes du bloc, les reçus de transaction et les journaux d’événements pour chaque nouveau bloc).
L'intervalle d'interrogation est un choix de conception crucial. Si vous interrogez trop fréquemment, vous gaspillez des requêtes RPC (et des crédits) en demandant « y a-t-il du nouveau ? » alors que la réponse est « non ». Sur Ethereum, où des blocs sont produits toutes les 12 secondes, une interrogation toutes les secondes signifie que 11 requêtes sur 12 ne renvoient rien d'utile. Si vous interrogez trop rarement, vous introduisez de la latence. Si votre intervalle est de 30 secondes, vous risquez de ne découvrir un nouveau bloc que 30 secondes après sa production. Vous risquez également de traiter plusieurs blocs par intervalle, ce qui crée une charge inégale sur votre système.
Le polling comporte plusieurs risques en matière de fiabilité. Si une interrogation échoue en raison d’une erreur réseau, d’une limitation de débit ou d’un problème au niveau d’un nœud, votre application risque de passer complètement à côté d’un bloc, à moins qu’elle ne garde en mémoire le numéro du dernier bloc traité et ne revienne en arrière lors de la prochaine interrogation réussie. Si votre application plante ou redémarre, elle doit déterminer où elle s'est arrêtée et reprendre à partir de ce point, en traitant tous les blocs générés pendant l'interruption. Si le processus de polling prend du retard en raison de retards de traitement, l'écart entre la pointe de la chaîne et l'état de votre application s'accroît, et rattraper ce retard nécessite de traiter un arriéré de blocs.
Sur les chaînes à haut débit, l’interrogation devient particulièrement problématique. Solana génère des créneaux toutes les 400 ms. Arbitrum et Base génèrent des blocs toutes les 250 ms. Interroger ces chaînes à leur rythme de production de blocs nécessite 2 à 4 requêtes RPC par seconde rien que pour vérifier les numéros de blocs, auxquelles s’ajoutent des requêtes supplémentaires pour obtenir les données complètes des blocs. À grande échelle, sur plusieurs chaînes, le volume (et le coût) des requêtes RPC augmente linéairement avec le nombre de chaînes et le rythme de production de blocs de chacune d’entre elles.
Comment fonctionne le streaming dans la pratique ?
Les abonnements WebSocket constituent la forme la plus simple de streaming blockchain. Votre application établit une connexion WebSocket persistante avec un nœud et envoie une requête d’abonnement (par exemple « eth_subscribe » avec « newHeads »). Le nœud transmet chaque nouvel en-tête de bloc à votre application via la connexion ouverte dès qu’il est généré. Pas d’interrogation, pas de requêtes inutiles, pas de décalage de latence.
Les WebSockets fonctionnent bien pour des cas d’utilisation simples, mais présentent des limites importantes à grande échelle. Les connexions sont « avec état » et peuvent être interrompues en raison de problèmes réseau, de redémarrages de serveurs ou de délais d’inactivité. Lorsqu’une connexion est interrompue, votre application passe à côté de tous les événements qui se produisent avant la reconnexion ; elle doit alors détecter la déconnexion, se reconnecter et combler le vide. La gestion de plusieurs connexions WebSocket simultanées sur plusieurs chaînes ajoute à la complexité. Les abonnements WebSocket ne prennent pas non plus en charge les données historiques. Si vous devez traiter des blocs datant de la semaine dernière, les WebSockets ne peuvent pas vous aider.
Les services de streaming spécialement conçus pour cela pallient ces limites. Au lieu de maintenir des connexions WebSocket fragiles, votre application configure un pipeline de données que le service de streaming gère de bout en bout. Le service se connecte aux nœuds de la blockchain, traite chaque bloc, applique vos filtres et transmet les résultats à votre destination avec une livraison garantie. Si votre destination est temporairement indisponible, le service met les données en mémoire tampon et réessaie. En cas de réorganisation, le service envoie des charges utiles de correction. Si vous avez besoin de données historiques, ce même pipeline peut effectuer un « backfill » à partir de n’importe quel bloc de départ.
Comparaison des deux approches
La latence est la différence la plus notable. Dans le meilleur des cas, la méthode par interrogation présente toujours une latence égale à l’intervalle d’interrogation ; dans la pratique, celle-ci est toutefois plus longue en raison du temps de traitement et de la récupération en cas d’erreur. Le streaming fournit les données dès qu’elles sont disponibles, généralement en l’espace de quelques secondes après la production d’un bloc. Pour les applications sensibles à la latence, telles que les robots de trading ou les tableaux de bord en temps réel, le streaming s’avère nettement plus rapide.
L'efficacité des ressources constitue la deuxième différence majeure. L'interrogation génère un volume de requêtes proportionnel à la fréquence d'interrogation, qu'il y ait ou non de nouvelles données. Un processus d'interrogation vérifiant la présence de nouveaux blocs toutes les secondes effectue 86 400 requêtes par jour, même s'il ne s'intéresse qu'à un événement spécifique qui se produit une fois par semaine. Le streaming consomme des ressources proportionnelles au volume réel de données. Si aucun événement ne correspond à vos critères de filtrage, rien n'est transmis et aucune ressource n'est consommée de votre côté.
C'est la fiabilité qui distingue ces deux approches à grande échelle. Le polling nécessite que votre application gère elle-même le suivi de l'état, la détection des lacunes, la récupération après erreur et la logique de rattrapage. Chaque cas particulier (blocs manqués, traitement en double, réorganisations, limitations de débit, basculement de nœuds) doit être géré dans votre code. Les services de streaming gèrent ces cas particuliers côté fournisseur, fournissant un flux sans lacunes, ordonné et dédupliqué que votre application peut traiter sans se soucier de la fiabilité de l'infrastructure.
La complexité est le compromis à accepter. L'interrogation est plus simple à mettre en œuvre au départ. Une boucle de polling basique peut être écrite en 20 lignes de code. Mais cette simplicité est trompeuse, car un polling optimisé pour la production nécessite une gestion des erreurs, une logique de backoff, une gestion des états, une détection des réorganisations et une surveillance qui peuvent rapidement atteindre des centaines de lignes. Le streaming nécessite une configuration initiale d’un pipeline de données et d’un système de destination capable de recevoir des données poussées (comme un serveur webhook ou une base de données dotée d’une logique d’ingestion appropriée), mais une fois configuré, il nécessite beaucoup moins de maintenance courante.
Quelle est la différence entre le « polling » et le « streaming » ?
Le polling et le streaming répondent au même besoin, à savoir intégrer des données on-chain actualisées dans votre application, mais ils inversent l’ flow de contrôle. Avec le polling, c’est votre code qui prend l’initiative : il appelle de manière répétée une interface RPC endpoint pour vérifier si des changements sont survenus. Avec le streaming, c’est le fournisseur qui prend l’initiative, en vous transmettant chaque nouveau bloc ou événement correspondant dès sa création. Le tableau ci-dessous compare ces deux modèles selon les critères les plus importants en environnement de production.
Dimension
Sondage
Streaming
Données flow
Grâce au modèle « pull », votre application demande des données
Grâce au système « push », les données sont transmises automatiquement
Latence
Égal ou supérieur à l'intervalle de sondage
En quelques secondes de production de blocs
Utilisation des ressources
Proportionnel à la fréquence d'interrogation, même en veille
Proportionnel au volume réel de données
Fiabilité à grande échelle
Votre application gère les lacunes, les tentatives de réinitialisation et les réorganisations
Le fournisseur fournit un flux ordonné et dédupliqué
Données historiques
Grâce à la réexécution des requêtes sur les blocs antérieurs
Prise en charge grâce au remplissage de ce même pipeline
Complexité de la mise en place
Facile à mettre en place, coûteux à sécuriser
Configuration unique, faible maintenance courante
Idéal pour
Scripts simples et vérifications peu fréquentes
Applications en temps réel et chaînes à haut débit
Comment choisir un intervalle d'interrogation ?
Si vous effectuez un polling, l'intervalle doit correspondre au temps de bloc de la chaîne que vous lisez. Un polling beaucoup plus rapide que la production des blocs entraîne un gaspillage de requêtes et peut déclencher une limitation de débit, tandis qu'un polling beaucoup plus lent que le temps de bloc ajoute une latence évitable et oblige votre worker à traiter plusieurs blocs à la fois. Le tableau ci-dessous répertorie les temps de bloc typiques et les implications pratiques en matière de polling pour chaque réseau.
Blockchain
Durée approximative du bloc
Conséquences du sondage
Bitcoin
Environ 10 minutes
Un intervalle de 1 à 2 minutes est largement suffisant
Ethereum
Environ 12 secondes
Effectuer une interrogation toutes les 4 à 12 secondes pour rester à jour sans gaspillage
BNB Smart Chain
Environ 3 secondes
L'interrogation par sous-blocs alourdit la charge sans apporter grand-chose
Base
Environ 250 ms
Le sondage ne parvient pas à suivre le rythme de manière fluide ; je préfère le streaming
Solana
Environ 400 ms
Volume élevé de requêtes ; le streaming est fortement recommandé
Dans quels cas faut-il continuer à utiliser la méthode de sondage ?
Le streaming est la meilleure option par défaut pour la plupart des charges de travail de production, mais l'interrogation reste un choix raisonnable dans certains cas. Les scripts ponctuels, les mises à jour rétrospectives et les tâches par lots peu fréquentes justifient rarement la mise en place d’un pipeline géré. L’interrogation régulière convient également lorsque vous n’avez besoin que d’une seule valeur à la demande, comme la vérification d’un solde avant une action de l’utilisateur, lorsqu’il n’existe pas de flux continu auquel s’abonner. Cependant, lorsque l’actualité et le volume des données sont importants, les compromis évoluent rapidement ; il est donc utile de bien comprendre la différence entre les données en temps réel et les données historiques avant de s’engager dans une approche particulière.
Comment le streaming gère-t-il les réorganisations et les pertes de données ?
Le plus difficile dans l’exploitation des données blockchain en temps réel, ce n’est pas le scénario idéal, mais bien les cas limites. Une réorganisation de la chaîne peut remplacer un bloc que votre application a déjà traité, et une connexion interrompue peut créer une lacune dans vos données. Avec l’interrogation brute ou les WebSockets, vous devez détecter et corriger ces situations vous-même. Un service géré tel que Quicknode Streams s'en charge à votre place : il fournit les données dans l'ordre de finalité, émet des charges utiles de correction en cas de réorganisation, et met en mémoire tampon et réessaie lorsque votre destination n'est pas disponible. C'est cette différence qui rend la diffusion par push tellement plus facile à gérer à grande échelle.
Foire aux questions
Le streaming est-il toujours préférable aux sondages ?
Pas toujours. Pour la plupart des applications de production nécessitant des données en continu et à faible latence, le streaming l'emporte en termes d'efficacité et de fiabilité. En revanche, pour les scripts ponctuels, les simples vérifications de solde ou les tâches peu fréquentes, l'interrogation régulière est tout à fait suffisante et plus facile à mettre en place. Le choix approprié dépend du degré d'actualité requis pour vos données et du volume que vous traitez. Pour une introduction au modèle « push », découvrez ce qu'est le streaming de données blockchain.
À quelle fréquence dois-je interroger une endpoint RPC ?
Adaptez votre intervalle d'interrogation à la durée de bloc de la chaîne. Sur Ethereum, une interrogation toutes les 4 à 12 secondes vous permet de rester à jour sans gaspiller d'appels. Sur des chaînes rapides comme Solana ou Base, une interrogation à la fréquence des blocs n'est pas viable et le streaming est la meilleure solution. Une interrogation bien plus rapide que la production des blocs ne renvoie généralement aucune nouvelle donnée et épuise votre budget de requêtes. Consultez le fonctionnement des requêtes RPC pour savoir ce qu'implique chaque appel.
Le sondage coûte-t-il plus cher que le streaming ?
C'est souvent le cas à grande échelle. L'interrogation génère des requêtes selon une fréquence fixe, qu'il y ait ou non de nouvelles données ; ainsi, un processus d'interrogation très sollicité peut effectuer des dizaines de milliers d'appels par jour pour capturer seulement quelques événements. Le streaming consomme des ressources proportionnellement aux données qui correspondent réellement à vos filtres, ce qui se traduit généralement par moins de requêtes inutiles et un coût moindre pour les charges de travail en continu.
Qu'advient-il de mes données lors d'une réorganisation ?
Avec un système de polling « naïf » ou l'utilisation brute de WebSockets, une réorganisation peut entraîner le maintien, dans votre application, de transactions qui n'existent plus sur la chaîne canonique. Un service de streaming géré détecte la réorganisation et envoie des charges utiles de correction afin que votre état reste cohérent. Comprendre la relation entre débit et latence vous aide également à déterminer combien de temps attendre avant de considérer les données comme validées.
Puis-je obtenir des données historiques auprès d'un service de streaming ?
Oui. Contrairement aux abonnements WebSocket, qui ne transmettent les nouveaux événements qu'à partir du moment où vous vous connectez, un pipeline de streaming complet peut récupérer les données antérieures à partir de n'importe quel bloc passé en utilisant la même configuration. Cela vous permet de rejouer l'historique, puis de passer en toute transparence aux données en temps réel sans avoir à faire fonctionner deux systèmes distincts.
Comment « Quicknode » prend en charge ces deux modèles
QuicknodeL'API Core de Quicknode prend en charge à la fois l'interrogation via des points de terminaison HTTP RPC et les abonnements en temps réel via des connexions WebSocket sur toutes les chaînes prises en charge. Pour les applications qui utilisent l'interrogation, le guide de consacré à l'optimisation des requêtes RPC présente les meilleures pratiques permettant de réduire au minimum les appels inutiles, de mettre en place une gestion des erreurs adéquate et de gérer les limites de débit.
Pour les applications prêtes à aller au-delà du polling, Quicknode Streams propose un pipeline de streaming entièrement géré. Streams fournit des données blockchain en temps réel avec une livraison garantie, un traitement par ordre de finalité, une gestion automatique des réorganisations et un filtrage côté serveur, le tout sans que votre application ait besoin de maintenir des connexions WebSocket ou une infrastructure de polling. Streams prend en charge la livraison vers webhooks, PostgreSQL, Snowflake, Amazon S3, Azure Storage et bien d’autres, ce qui le rend adaptable à n’importe quelle architecture backend. Un guide de comparaison directe entre les abonnements WebSocket et Streams est disponible dans la documentation de Quicknode. Il présente les compromis et la voie de migration pour les équipes passant d’architectures basées sur l’interrogation ou sur WebSocket.