Les échecs de publication sont généralement dus à des goulots d'étranglement côté client, tels qu'un manque de CPU de service, un mauvais état des threads ou une congestion du réseau. La stratégie de nouvelle tentative de l'éditeur définit le nombre de fois où Pub/Sub tente de distribuer un message et la durée entre chaque tentative.
Ce document fournit des informations sur l'utilisation des requêtes de réessai avec les messages publiés dans un sujet.
Avant de commencer
Avant de configurer le workflow de publication, assurez-vous d'avoir effectué les tâches suivantes :
- En savoir plus sur les sujets et le workflow de publication
- Créez un sujet.
Rôles requis
Pour obtenir les autorisations nécessaires pour réessayer d'envoyer des requêtes de message à un sujet, demandez à votre administrateur de vous accorder le rôle IAM Diffuseur Pub/Sub (roles/pubsub.publisher) sur le sujet.
Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.
Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.
Vous devez disposer d'autorisations supplémentaires pour créer ou modifier des thèmes et des abonnements.
À propos des demandes de nouvelle tentative
Les paramètres de nouvelle tentative contrôlent la manière dont les bibliothèques clientes Pub/Sub relancent les requêtes de publication. Les bibliothèques clientes ont les paramètres de réessai suivants :
- Délai avant expiration de la requête initiale : délai avant l'arrêt d'une bibliothèque cliente en attente de l'exécution de la requête de publication initiale.
- Délai de nouvelle tentative : délai qui s'écoule entre le moment où une requête expire et le moment où une bibliothèque cliente effectue la nouvelle tentative.
- Délai avant expiration total : délai avant qu'une bibliothèque cliente n'arrête de relancer les requêtes de publication.
Pour relancer les requêtes de publication, le délai avant expiration de la requête initiale doit être inférieur au délai avant expiration total. Par exemple, si vous utilisez un intervalle exponentiel entre les tentatives, les bibliothèques clientes calculent le délai avant expiration de la requête et le délai de nouvelle tentative comme suit :
- Après chaque requête de publication, le délai avant expiration de la requête augmente en fonction du multiplicateur de délai avant expiration de la requête, jusqu'à atteindre le délai maximal avant expiration de la requête.
- Après chaque nouvelle tentative, le délai de nouvelle tentative augmente par le multiplicateur, jusqu'à atteindre le délai maximum de nouvelles tentatives.
Renvoyer une demande de message
Lors du processus de publication, des échecs de publication temporaires ou permanents peuvent s'afficher. Pour les erreurs temporaires, vous n'avez généralement pas besoin d'effectuer d'action spéciale, car Pub/Sub relance automatiquement les messages.
Une erreur peut également se produire lorsqu'une opération de publication réussit, mais que le client de l'éditeur ne reçoit pas la réponse de publication à temps. Dans ce cas également, l'opération de publication est relancée. Par conséquent, vous pouvez avoir deux messages identiques avec des ID différents.
En cas d'erreurs persistantes, envisagez d'implémenter des actions appropriées en dehors du processus de publication pour éviter de surcharger Pub/Sub.
Les échecs de publication sont automatiquement relancés, sauf pour les erreurs qui ne justifient pas de nouvelles tentatives. Cet exemple de code montre comment créer un éditeur avec des paramètres de nouvelle tentative personnalisés (notez que toutes les bibliothèques clientes ne prennent pas en charge les paramètres de nouvelle tentative personnalisés ; consultez la documentation de référence de l'API pour le langage de votre choix) :
C++
Avant d'essayer cet exemple, suivez les instructions de configuration pour C++ dans le guide de démarrage rapide : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub 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 de l'API Pub/Sub C#.
Go
L'exemple suivant utilise la version majeure de la bibliothèque cliente Go Pub/Sub (v2). Si vous utilisez toujours la bibliothèque v1, consultez le guide de migration vers la v2. Pour obtenir la liste des exemples de code v1, consultez les exemples de code obsolètes.
Avant d'essayer cet exemple, suivez les instructions de configuration pour Go dans le guide de démarrage rapide : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub en langage Go.
Java
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Java se trouvant sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub en langage 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 de l'API Pub/Sub en langage 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 de l'API Pub/Sub en langage 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 de l'API Pub/Sub en langage Python.
Rust
Avant d'essayer cet exemple, suivez les instructions de configuration pour Rust dans le guide de démarrage rapide : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub Rust.
Réessayer les requêtes avec des clés de tri
Imaginons que vous n'ayez qu'un seul client éditeur. Vous utilisez les bibliothèques clientes Pub/Sub pour publier les messages 1, 2 et 3 pour la même clé de tri A. Supposons maintenant que le client éditeur ne reçoive pas la réponse publiée pour le message 1 avant l'expiration du délai RPC. Le message 1 doit être republié. La séquence de messages reçus par le client abonné devient alors 1, 1, 2 et 3, en supposant que le message 2 n'est publié qu'une fois le message 1 terminé. Chaque message publié possède son propre ID. Du point de vue du client abonné, quatre messages ont été publiés, les deux premiers ayant un contenu identique.
Les paramètres de lot peuvent également compliquer la réitération des requêtes de publication avec des clés de tri. La bibliothèque cliente regroupe les messages pour une publication plus efficace. Reprenons l'exemple précédent et supposons que les messages 1 et 2 sont regroupés. Ce lot est envoyé au serveur sous la forme d'une seule requête. Si le serveur ne parvient pas à renvoyer une réponse à temps, le client éditeur relance ce lot de deux messages. Il est donc possible que le client abonné reçoive les messages 1, 2, 1, 2 et 3. Si vous utilisez une bibliothèque cliente Pub/Sub pour publier des messages dans l'ordre et qu'une opération de publication échoue, le service fait échouer les opérations de publication pour tous les messages restants ayant la même clé de tri. Un client éditeur peut alors décider d'effectuer l'une des opérations suivantes :
Republier tous les messages ayant échoué dans l'ordre
Republier un sous-ensemble des messages ayant échoué dans l'ordre
Publier un nouvel ensemble de messages
Si une erreur ne permettant aucune autre tentative se produit, la bibliothèque cliente ne publie pas le message et cesse la publication d'autres messages avec la même clé de tri. Par exemple, lorsqu'un éditeur envoie un message à un sujet qui n'existe pas, une erreur ne permettant aucune autre tentative se produit. Pour continuer à publier des messages avec la même clé de tri, appelez une méthode permettant de reprendre la publication, puis redémarrez la publication.
L'exemple suivant montre comment reprendre la publication de messages avec la même clé de tri.
C++
Avant d'essayer cet exemple, suivez les instructions de configuration pour C++ dans le guide de démarrage rapide : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub 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 de l'API Pub/Sub C#.
Go
L'exemple suivant utilise la version majeure de la bibliothèque cliente Go Pub/Sub (v2). Si vous utilisez toujours la bibliothèque v1, consultez le guide de migration vers la v2. Pour obtenir la liste des exemples de code v1, consultez les exemples de code obsolètes.
Avant d'essayer cet exemple, suivez les instructions de configuration pour Go dans le guide de démarrage rapide : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub en langage Go.
Java
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Java se trouvant sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub en langage 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 de l'API Pub/Sub en langage 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 de l'API Pub/Sub en langage Python.
Ruby
L'exemple suivant utilise la bibliothèque cliente Ruby Pub/Sub v3. Si vous utilisez toujours la bibliothèque v2, consultez le guide de migration vers la v3. Pour obtenir la liste des exemples de code Ruby v2, consultez les exemples de code obsolètes.
Avant d'essayer cet exemple, suivez les instructions de configuration pour Ruby dans le guide de démarrage rapide : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub en langage Ruby.
Rust
Avant d'essayer cet exemple, suivez les instructions de configuration pour Rust dans le guide de démarrage rapide : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub Rust.
Étapes suivantes
Pour savoir comment configurer les options de publication avancées, consultez les ressources suivantes :