Les échecs de publication sont généralement causés par des goulots d'étranglement côté client, tels qu'un nombre insuffisant de processeurs 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 le délai entre chaque tentative.
Ce document fournit des informations sur l'utilisation des requêtes de nouvelle tentative 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 relancer les requêtes de messages vers un sujet, demandez à votre administrateur de vous accorder le rôle IAM Éditeur 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 mettre à jour des sujets 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 nouvelle tentative 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.
Réessayer d'envoyer une invitation à discuter
Pendant le processus de publication, vous pouvez rencontrer des échecs de publication temporaires ou permanents. Pour les erreurs temporaires, vous n'avez généralement pas besoin de prendre de mesures particulières, car Pub/Sub relance automatiquement les messages.
Une erreur peut également se produire lorsqu'une opération de publication réussit, mais que la réponse de publication n'est pas reçue à temps par le client éditeur. Dans ce cas également, l'opération de publication est relancée. Par conséquent, vous pouvez avoir deux messages identiques avec des ID de message différents.
En cas d'erreurs persistantes, envisagez de mettre en œuvre 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 sont pas compatibles avec 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 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 en langage 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 en langage C#.
Go
L'exemple suivant utilise la version majeure de la bibliothèque cliente Pub/Sub pour Go (v2). Si vous utilisez toujours la bibliothèque v1, consultez le guide de migration vers la v2. Pour afficher 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 décrites 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 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 Java Pub/Sub.
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 Python Pub/Sub.
Rust
Avant d'essayer cet exemple, suivez les instructions de configuration de 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 pour Rust.
Réessayer les requêtes avec des clés de tri
Supposons 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 la réponse publiée pour le message 1 ne soit pas reçue par le client éditeur avant l'expiration du délai d'expiration du 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, si l'on suppose que le message 2 n'est publié qu'une fois le message 1 terminé. Chaque message publié possède son propre ID de message. 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 les nouvelles tentatives de requêtes de publication avec des clés de tri. La bibliothèque cliente regroupe les messages pour une publication plus efficace. Poursuivons avec 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 renvoie pas de réponse à temps, le client éditeur relance l'envoi de ce lot de deux messages. Par conséquent, il est 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 sur 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 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 en langage 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 en langage C#.
Go
L'exemple suivant utilise la version majeure de la bibliothèque cliente Pub/Sub pour Go (v2). Si vous utilisez toujours la bibliothèque v1, consultez le guide de migration vers la v2. Pour afficher 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 décrites 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 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 Java Pub/Sub.
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 Python Pub/Sub.
Ruby
L'exemple suivant utilise la version 3 de la bibliothèque cliente Pub/Sub pour Ruby. Si vous utilisez toujours la bibliothèque v2, consultez le guide de migration vers la version 3. Pour afficher 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 décrites 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 de 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 pour Rust.
Étapes suivantes
Pour savoir comment configurer les options de publication avancées, consultez les ressources suivantes :