Ce document présente un abonnement pull, son workflow et les propriétés associées.
Dans un abonnement pull, un client abonné demande des messages au serveur Pub/Sub.
Le mode pull peut utiliser l'une des deux API de service, Pull ou StreamingPull. Pour exécuter l'API choisie, vous pouvez sélectionner une bibliothèque cliente de haut niveau fournie par Google ou une bibliothèque cliente de bas niveau générée automatiquement. Vous pouvez également choisir entre le traitement asynchrone et synchrone des messages.
Avant de commencer
Avant de lire ce document, assurez-vous de connaître les éléments suivants:
Fonctionnement de Pub/Sub et différents termes de Pub/Sub
Les différents types d'abonnements compatibles avec Pub/Sub et pourquoi vous pouvez utiliser un abonnement pull.
Workflow d'abonnement pull
Pour un abonnement pull, votre client abonné envoie des requêtes à un serveur Pub/Sub pour récupérer les messages. Le client abonné utilise l'une des API suivantes:
La plupart des clients abonnés n'effectuent pas ces requêtes directement. Au lieu de cela, les clients s'appuient sur la bibliothèque cliente de haut niveau fournie par Google Cloud, qui effectue des requêtes pull en streaming en interne et envoie des messages de manière asynchrone. Pour un client abonné qui a besoin de mieux contrôler la façon dont les messages sont extraits, Pub/Sub utilise une bibliothèque gRPC de bas niveau générée automatiquement. Cette bibliothèque envoie directement des requêtes pull ou streaming. Ces requêtes peuvent être synchrones ou asynchrones.
Les deux images suivantes illustrent le workflow entre un client abonné et un abonnement pull.
Workflow de pull
Le workflow de pull se présente comme suit et fait référence à la figure 1:
- Le client abonné appelle explicitement la méthode
pull
, qui demande la distribution des messages. Cette requête correspond àPullRequest
, comme illustré dans l'image. Le serveur Pub/Sub répond par zéro message ou plus, ainsi que par des ID de confirmation. Une réponse sans message ou avec une erreur n'indique pas nécessairement qu'aucun message n'est disponible à recevoir. Cette réponse est
PullResponse
, comme illustré dans l'image.Le client abonné appelle explicitement la méthode
acknowledge
. Le client utilise l'ID de confirmation renvoyé pour confirmer que le message est traité et qu'il n'a pas besoin d'être renvoyé.
Pour une seule demande d'extraction en streaming, un client abonné peut recevoir plusieurs réponses en raison de la connexion ouverte. En revanche, une seule réponse est renvoyée pour chaque demande d'extraction.
Propriétés d'un abonnement pull
Les propriétés que vous configurez pour un abonnement pull déterminent la façon dont vous écrivez des messages dans votre abonnement. Pour en savoir plus, consultez les propriétés d'abonnement.
API de service Pub/Sub
L'abonnement pull Pub/Sub peut utiliser l'une des deux API suivantes pour récupérer les messages:
- Pull
- StreamingPull
Utilisez des RPC unary Acknowledge et ModifyAckDeadline lorsque vous recevez des messages à l'aide de ces API. Les deux API Pub/Sub sont décrites dans les sections suivantes.
API StreamingPull
Dans la mesure du possible, les bibliothèques clientes Pub/Sub utilisent StreamingPull afin d'assurer un débit maximal et une latence minimale. Bien que vous ne vous servirez peut-être jamais directement de l'API StreamingPull, il est important de savoir en quoi elle diffère de l'API Pull.
L'API StreamingPull s'appuie sur une connexion bidirectionnelle persistante pour recevoir plusieurs messages dès qu'ils sont disponibles. Voici le workflow:
Le client envoie une requête au serveur pour établir une connexion. Si le quota de connexions est dépassé, le serveur renvoie une erreur de ressources épuisées. La bibliothèque cliente relance automatiquement les erreurs de quota dépassé.
En l'absence d'erreur ou si le quota de connexion est à nouveau disponible, le serveur envoie en continu des messages au client connecté.
Si le quota de débit est dépassé, le serveur arrête d'envoyer des messages. Toutefois, la connexion n'est pas interrompue. Chaque fois qu'un quota de débit suffisant est à nouveau disponible, le flux reprend.
Le client ou le serveur ferme finalement la connexion.
L'API StreamingPull maintient une connexion ouverte. Les serveurs Pub/Sub ferment régulièrement la connexion après un certain temps pour éviter une connexion persistante de longue durée. La bibliothèque cliente rouvre automatiquement une connexion StreamingPull.
Les messages sont envoyés à la connexion lorsqu'ils sont disponibles. L'API StreamingPull minimise ainsi la latence et maximise le débit des messages.
En savoir plus sur les méthodes RPC StreamingPull : StreamingPullRequest et StreamingPullResponse
API Pull
Cette API est une RPC unaire traditionnelle basée sur un modèle de requête et de réponse. Une seule réponse de pull correspond à une seule demande d'extraction'extraction. Voici le workflow:
Le client envoie une requête de messages au serveur. Si le quota de débit est dépassé, le serveur renvoie une erreur de ressources épuisées.
En l'absence d'erreur ou si le quota de débit est à nouveau disponible, le serveur répond avec zéro message ou plus, ainsi qu'avec des ID de confirmation.
Lorsque vous utilisez l'API Pull unaire, une réponse ne contenant aucun message ou comportant une erreur n'indique pas nécessairement qu'aucun message n'est disponible à recevoir.
L'utilisation de l'API Pull ne garantit pas une faible latence et un débit élevé des messages. Pour obtenir un débit élevé et une latence faible avec l'API Pull, vous devez disposer de plusieurs requêtes en attente simultanées. De nouvelles requêtes sont créées lorsque les anciennes requêtes reçoivent une réponse. La conception d'une telle solution est sujette aux erreurs et difficile à gérer. Nous vous recommandons d'utiliser l'API StreamingPull pour de tels cas d'utilisation.
N'utilisez l'API Pull à la place de l'API StreamingPull que si vous avez besoin d'un contrôle strict sur les éléments suivants:
- Nombre de messages que le client abonné peut traiter
- La mémoire et les ressources du client
Vous pouvez également utiliser cette API lorsque votre abonné est un proxy entre Pub/Sub et un autre service qui fonctionne de manière plus orientée pull.
En savoir plus sur les méthodes REST pull : Méthode: projects.subscriptions.pull
En savoir plus sur les méthodes RPC pull : PullRequest et PullResponse
Types de modes de traitement des messages
Choisissez l'un des modes de pull suivants pour vos clients abonnés.
Mode pull asynchrone
Le mode pull asynchrone dissocie la réception des messages du traitement des messages dans un client abonné. Il s'agit du mode par défaut pour la plupart des clients abonnés. Le mode pull asynchrone peut utiliser l'API StreamingPull ou l'API Pull unaire. La récupération asynchrone peut également utiliser la bibliothèque cliente de haut niveau ou la bibliothèque cliente générée automatiquement de bas niveau.
Vous en apprendrez plus sur les bibliothèques clientes plus loin dans ce document.
Mode pull synchrone
En mode pull synchrone, la réception et le traitement des messages se produisent de manière séquentielle et ne sont pas dissociés. Par conséquent, comme pour StreamingPull par rapport aux API Pull unaires, le traitement asynchrone offre une latence plus faible et un débit plus élevé que le traitement synchrone.
N'utilisez le mode pull synchrone que pour les applications où la faible latence et le débit élevé ne sont pas les facteurs les plus importants par rapport à d'autres exigences. Par exemple, une application peut être limitée à n'utiliser que le modèle de programmation synchrone. Une application avec des contraintes de ressources peut également nécessiter un contrôle plus précis de la mémoire, du réseau ou du processeur. Dans ce cas, utilisez le mode synchrone avec l'API Pull unaire.
Bibliothèques clientes Pub/Sub
Pub/Sub propose une bibliothèque cliente générée automatiquement à haut et bas niveau.
Bibliothèque cliente Pub/Sub de haut niveau
La bibliothèque cliente de haut niveau fournit des options permettant de contrôler les délais de confirmation à l'aide de la gestion des baux. Ces options sont plus précises que lorsque vous configurez les délais de confirmation à l'aide de la console ou de la CLI au niveau de l'abonnement. La bibliothèque cliente de haut niveau implémente également la compatibilité avec des fonctionnalités telles que la diffusion ordonnée, la diffusion exactement une fois et le contrôle de flux.
Nous vous recommandons d'utiliser le pull asynchrone et l'API StreamingPull avec la bibliothèque cliente de haut niveau. Tous les langages compatibles avec Google Cloud ne sont pas compatibles avec l'API Pull dans la bibliothèque cliente de haut niveau.
Pour utiliser les bibliothèques clientes de haut niveau, consultez la section Bibliothèques clientes Pub/Sub.
Bibliothèque cliente Pub/Sub générée automatiquement à bas niveau
Une bibliothèque cliente de bas niveau est disponible lorsque vous devez utiliser directement l'API Pull. Vous pouvez utiliser le traitement synchrone ou asynchrone avec la bibliothèque cliente générée automatiquement de bas niveau. Vous devez coder manuellement des fonctionnalités telles que la diffusion ordonnée, la diffusion exactement une fois, le contrôle de flux et la gestion des baux lorsque vous utilisez la bibliothèque cliente générée automatiquement à bas niveau.
Vous pouvez utiliser le modèle de traitement synchrone lorsque vous utilisez la bibliothèque cliente générée automatiquement de bas niveau pour tous les langages compatibles. Vous pouvez utiliser la bibliothèque cliente générée automatiquement de bas niveau et le pull synchrone dans les cas où l'utilisation directe de l'API Pull est pertinente. Par exemple, vous pouvez avoir une logique d'application existante qui s'appuie sur ce modèle.
Pour utiliser directement les bibliothèques clientes de bas niveau générées automatiquement, consultez la présentation des API Pub/Sub.
Exemples de code de bibliothèque cliente
Exemples de code pour StreamingPull et la bibliothèque cliente de haut niveau
C++
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage C++ qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour C++.
C#
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage C# qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour C#.
Go
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Go qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Go.
Java
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Java qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Java.
Node.js
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Node.js qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Node.js.
Node.js
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Node.js qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Node.js.
Python
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Python qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Python.
Ruby
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Ruby qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Ruby.
Récupérer des attributs personnalisés à l'aide de la bibliothèque cliente de haut niveau
Les exemples suivants montrent comment extraire des messages de manière asynchrone et récupérer les attributs personnalisés à partir des métadonnées.
C++
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage C++ qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour C++.
C#
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage C# qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour C#.
Go
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Go qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Go.
Java
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Java qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Java.
Node.js
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Node.js qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Node.js.
Python
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Python qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Python.
Ruby
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Ruby qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Ruby.
Gérer les erreurs à l'aide de la bibliothèque cliente de haut niveau
Les exemples suivants montrent comment gérer les erreurs qui surviennent lors de l'abonnement à des messages.
C++
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage C++ qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour C++.
Go
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Go qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Go.
Java
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Java qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Java.
Node.js
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Node.js qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Node.js.
Python
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Python qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Python.
Ruby
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Go qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Go.
Exemples de code de pull unaire
Vous trouverez ci-dessous un exemple de code permettant d'extraire et de confirmer un nombre fixe de messages.
C++
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage C++ qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour C++.
C#
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage C# qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour C#.
Java
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Java qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Java.
Node.js
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Node.js qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Node.js.
PHP
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Node.js qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Node.js.
Ruby
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Ruby qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Ruby.
Protocole
Requête :
POST https://pubsub.googleapis.com/v1/projects/myproject/subscriptions/mysubscription:pull
{
"returnImmediately": "false",
"maxMessages": "1"
}
Réponse :
200 OK
{
"receivedMessages": [{
"ackId": "dQNNHlAbEGEIBERNK0EPKVgUWQYyODM2LwgRHFEZDDsLRk1SK...",
"message": {
"data": "SGVsbG8gQ2xvdWQgUHViL1N1YiEgSGVyZSBpcyBteSBtZXNzYWdlIQ==",
"messageId": "19917247034"
}
}]
}
Requête :
POST https://pubsub.googleapis.com/v1/projects/myproject/subscriptions/mysubscription:acknowledge
{
"ackIds": [
"dQNNHlAbEGEIBERNK0EPKVgUWQYyODM2LwgRHFEZDDsLRk1SK..."
]
}
Python
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Python qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Python.
Pub/Sub transmet une liste de messages. Si la liste comporte plusieurs messages, Pub/Sub les classe suivant la même clé de tri. Voici quelques mises en garde importantes:
Définir une valeur pour
max_messages
dans la requête ne garantit pas quemax_messages
est renvoyé, même s'il y a autant de messages dans la file d'attente. L'API Pub/Sub Pull peut renvoyer moins demax_messages
afin de réduire la latence de distribution des messages prêts à être distribués.Une réponse de pull qui ne contient aucun message ne doit pas être utilisée pour indiquer qu'il n'y a pas de messages dans la file d'attente. Il est possible d'obtenir une réponse avec zéro message et une requête ultérieure qui renvoie des messages.
Pour obtenir une faible latence de distribution des messages avec le mode pull unaire, il est essentiel de disposer de nombreuses requêtes pull en attente simultanément. Au fur et à mesure que le débit du sujet augmente, davantage de requêtes pull sont nécessaires. En général, le mode StreamingPull est préférable pour les applications sensibles à la latence.
Quotas et limites
Les connexions Pull et StreamingPull sont soumises à des quotas et limites. Pour en savoir plus, consultez la page Quotas et limites de Pub/Sub.
Étape suivante
Créez un abonnement pull pour votre sujet.
Créez ou modifiez un abonnement avec la gcloud CLI.
Créez ou modifiez un abonnement à l'aide des API REST.
Créez ou modifiez un abonnement à l'aide des API RPC.