Les échecs de publication sont généralement causés par des goulots d'étranglement côté client, tels que des processeurs de service insuffisants, un mauvais état de thread ou un encombrement 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 nouvelles tentatives avec les messages publiées dans un sujet.
Avant de commencer
Avant de configurer le workflow de publication, assurez-vous d'avoir effectué les opérations suivantes tâches:
- Découvrez les thèmes et le workflow de publication.
- Créez un sujet.
Rôles requis
Pour obtenir les autorisations dont vous avez besoin pour relancer
les messages adressés à un sujet,
demandez à votre administrateur de vous accorder le
Éditeur Pub/Sub (roles/pubsub.publisher
) sur le sujet.
Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.
Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.
Vous avez besoin d'autorisations supplémentaires pour créer ou modifier des sujets et des abonnements.
À propos des nouvelles tentatives de requêtes
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 sont associées à l'un des 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 un message
Pendant le processus de publication, vous constaterez peut-être des publications temporaires ou permanentes d'échecs. Pour les erreurs temporaires, aucune action spéciale n'est généralement requise de votre part, car Pub/Sub relance automatiquement les messages.
Une erreur peut également se produire lorsqu'une opération de publication aboutit, la réponse n'est pas reçue à temps par le client éditeur. Dans ce cas également, l'opération de publication est réessayée. Par conséquent, vous pouvez avoir deux messages identiques avec des ID de message 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 font automatiquement l'objet de nouvelles tentatives, sauf pour les erreurs garantir de nouvelles tentatives. Cet exemple de code illustre la création d'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. Consultez la documentation de référence sur les API pour le langage que vous avez choisi) :
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.
Relancer des 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 avec la même clé de tri A. Supposons maintenant que la réponse publiée pour le message 1 soit n'ont pas été reçus par le client éditeur avant l'expiration du délai de RPC. Le message 1 doit être republié. La séquence des messages reçus par le client abonné devient alors 1, 1, 2 et 3, si vous supposez que le message 2 n'est publié qu'après la réussite du message 1. Chaque message publié est associé à un ID de message. Du point de vue du client abonné, quatre messages ont été publiés, dont les deux premiers ont un contenu identique.
Les nouvelles tentatives de requêtes de publication avec des clés de tri peuvent aussi être compliquées par lot paramètres. La bibliothèque cliente regroupe les messages pour une publication plus efficace. Reprenez l'exemple précédent en partant du principe que les messages 1 et 2 sont regroupés. Ce lot est envoyé au serveur sous la forme d'une requête unique. Si le serveur ne parvient pas à renvoyer une réponse à temps, le client éditeur réessaie ce lot de deux messages. Par conséquent, il est possible que le client abonné reçoit les messages 1, 2, 1, 2 et 3. Si vous utilisez une instance Pub/Sub une bibliothèque cliente pour publier les messages dans l'ordre, et une opération de publication échoue, le service échoue aux opérations de publication pour tous les messages restants clé de tri. Un client éditeur peut ensuite 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 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.
Étape suivante
Pour savoir comment configurer les options de publication avancées, consultez les ressources suivantes :