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 l'encombrement du réseau. La règle de nouvelle tentative de l'éditeur définit le nombre de tentatives de distribution d'un message par Pub/Sub et le délai entre chaque tentative.
Ce document fournit des informations sur l'utilisation de 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:
Rôles requis
Pour obtenir les autorisations dont vous avez besoin pour relancer les requêtes de message sur un sujet, demandez à votre administrateur de vous attribuer le rôle IAM Éditeur Pub/Sub (roles/pubsub.publisher
) pour le sujet.
Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.
Vous pouvez également obtenir les autorisations requises via 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 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 une invitation à discuter
Au cours du processus de publication, vous pouvez rencontrer des échecs de publication temporaires ou permanents. Pour les erreurs temporaires, vous n'avez généralement aucune action spéciale à effectuer, car Pub/Sub relance automatiquement les messages.
Une erreur peut également se produire lorsqu'une opération de publication aboutit, mais que la réponse de publication n'est pas reçue à temps par le client éditeur. Dans ce cas aussi, 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 les actions appropriées en dehors du processus de publication pour éviter de surcharger Pub/Sub.
En cas d'échec de publication, de nouvelles tentatives sont automatiquement effectuées, sauf en cas d'erreurs qui ne justifient pas 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 ayez 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 au message 1 n'est pas reçue par le client éditeur 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, si vous supposez 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 nouvelles tentatives de requêtes de publication avec des clés de tri peuvent également être compliquées par les paramètres de traitement par lot. La bibliothèque cliente regroupe les messages pour une publication plus efficace. Poursuivez 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 requête unique. Si le serveur ne parvient pas à renvoyer une réponse à temps, le client de l'éditeur relance 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 ensuite décider d'effectuer l'une des opérations suivantes:
Republier tous les messages ayant échoué dans l'ordre
Publier à nouveau un sous-ensemble de 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.
Étapes suivantes
Pour savoir comment configurer les options de publication avancées, consultez les pages suivantes: