Résoudre les problèmes liés à un abonnement pull

Ce document fournit quelques conseils de dépannage courants pour les abonnements pull Pub/Sub. Pour en savoir plus sur les abonnements en mode pull, consultez le Guide pour les abonnés – Mode pull.

Pour surveiller efficacement votre abonnement Pub/Sub, nous vous recommandons de commencer par examiner le score d'état de latence de distribution (subscription/delivery_latency_health_score) afin de vérifier quels facteurs peuvent contribuer à une latence inattendue ou accrue.

L'âge du plus ancien message non confirmé continue d'augmenter

oldest_unacked_message_age est une métrique essentielle pour surveiller l'état des abonnements Pub/Sub. Elle mesure l'âge, en secondes, du plus ancien message dans les messages en attente d'un abonnement qui n'a pas encore été confirmé par un abonné. Cette métrique fournit des informations précieuses sur les éventuels retards de traitement ou goulots d'étranglement.

La surveillance du backlog de messages permet de traiter les messages de manière rapide et efficace. En suivant l'âge du plus ancien message non confirmé, vous pouvez identifier de manière proactive les situations où les consommateurs sont en retard. Cette pratique permet une intervention précoce pour résoudre les problèmes potentiels liés à la dégradation des performances.

Voici quelques problèmes courants liés au backlog que vous pouvez examiner :

Problèmes de configuration du client

Lorsque les métriques oldest_unacked_message_age et num_undelivered_messages augmentent simultanément, cela peut signifier que les abonnés n'arrivent pas à gérer le volume de messages. Dans ce cas, concentrez votre enquête sur les composants de l'abonné :

  • État du client : analysez l'utilisation des ressources sur les machines hébergeant des clients abonnés, comme le processeur, la mémoire et la bande passante du réseau. Identifiez les points de pression qui pourraient nuire à l'efficacité du traitement.

  • Code client : examinez les modifications récentes du code et les journaux d'erreurs. Les bugs ou les inefficacités dans le code de l'abonné peuvent avoir un impact significatif sur les taux de traitement des messages. Notez que certains messages peuvent présenter des problèmes. Par exemple, plusieurs messages peuvent avoir besoin d'accéder simultanément à la même ligne d'une base de données. Ce comportement peut entraîner des conflits et une latence élevée.

  • Limites de quota : vérifiez que vous n'avez pas dépassé les quotas ni les limites Pub/Sub imposés par votre service d'hébergement. Si les abonnés sont hébergés dans Google Cloud, vérifiez les quotas de ressources Compute Engine ou GKE pour éviter d'éventuels goulots d'étranglement.

L'abonné a envoyé un accusé de réception négatif pour les messages.

Lorsqu'un abonné envoie un accusé de réception négatif (NACK) pour un message, il indique à Pub/Sub que le message n'a pas pu être traité correctement. Pub/Sub tente ensuite de redistribuer le même message. Des NACK répétés pour un message entraînent des doublons et potentiellement un délai de livraison élevé.

Notez que le fait d'envoyer un accusé de réception négatif pour un message ne garantit pas que l'extraction suivante récupérera un message différent. Il est possible que la stratégie de nouvelle distribution de Pub/Sub continue de distribuer à nouveau les messages ayant fait l'objet d'un NACK avant les nouveaux. Par conséquent, ne vous fiez pas aux NACK pour filtrer ou ignorer des messages spécifiques. Définissez plutôt une stratégie de nouvelle tentative, de préférence un intervalle exponentiel entre les tentatives, pour les messages individuels qui sont susceptibles d'être traités ultérieurement, mais qui ont besoin d'un peu plus de temps avant d'être renvoyés.

Si vous devez intentionnellement ignorer certains messages, nous vous recommandons de les accuser de réception, même si vous ne les traitez pas. Cela les supprime de l'abonnement, évite les nouvelles distributions inutiles et réduit la consommation de ressources. Le fait de ne pas confirmer la réception des messages, intentionnellement ou non, crée des problèmes de messages en attente et de distribution en double.

Latence de distribution élevée

Dans Pub/Sub, la latence de distribution correspond au temps nécessaire pour qu'un message envoyé par un éditeur parvienne à un abonné. Certaines causes possibles d'une latence de diffusion élevée sont décrites dans les sections suivantes.

Nombre d'abonnés insuffisant

Pour les clients qui utilisent StreamingPull, afin d'obtenir une latence faible et constante, maintenez plusieurs connexions StreamingPull ouvertes à votre abonnement. Sans connexions d'abonnés actifs, Pub/Sub ne peut pas distribuer les messages rapidement. Un flux unique peut être un point de défaillance unique, ce qui augmente le risque de retard. La métrique subscription/open_streaming_pulls indique le nombre de connexions de streaming actives. Utilisez-le pour vous assurer de disposer en permanence de suffisamment de flux pour gérer les messages entrants.

Pour les clients qui utilisent l'extraction unaire, afin d'obtenir une latence faible et constante, maintenez plusieurs requêtes d'extraction en attente pour votre abonnement. Les requêtes peu fréquentes peuvent potentiellement accumuler des messages dans le backlog et augmenter la latence. Cette approche permet de minimiser les lacunes de connectivité et d'améliorer la latence de diffusion.

La bibliothèque cliente de haut niveau est recommandée lorsque vous avez besoin d'un débit élevé et d'une faible latence avec des frais opérationnels et de traitement minimaux. Par défaut, la bibliothèque cliente de haut niveau utilise l'API StreamingPull, car elle est généralement plus adaptée pour minimiser la latence. Les bibliothèques clientes de haut niveau contiennent des fonctions et des classes prédéfinies qui gèrent les appels d'API sous-jacents pour l'authentification, l'optimisation du débit et de la latence, la mise en forme des messages et d'autres fonctionnalités.

Problèmes de configuration du client

Consultez Problèmes de configuration du client.

File d'attente importante

Notez qu'un backlog de messages non confirmés dans un abonnement Pub/Sub augmente intrinsèquement la latence de bout en bout, car les abonnés ne traitent pas les messages immédiatement.

Clés de commande et distribution de type "exactement une fois"

Les clés de tri et la distribution "exactement une fois" sont des fonctionnalités utiles, mais elles nécessitent une coordination supplémentaire dans Pub/Sub pour garantir une distribution correcte. Cette coordination peut réduire la disponibilité et augmenter la latence. Bien que la différence soit minime à l'état stable, toute étape de coordination nécessaire peut entraîner une augmentation temporaire de la latence ou du taux d'erreur. Si le tri est activé, les messages avec une clé de tri ne peuvent pas être distribués tant que les messages précédents avec la même clé de tri n'ont pas été confirmés.

Déterminez si l'ordre des messages ou la distribution de type "exactement une fois" sont absolument essentiels pour votre application. Si la faible latence est votre priorité absolue, minimiser l'utilisation de ces fonctionnalités peut vous aider à réduire les délais de traitement des messages.

Augmentation de la taille des messages

Une augmentation soudaine de la taille des messages peut potentiellement augmenter le temps de transfert entre Pub/Sub et votre client, et ralentir le temps de traitement des messages côté client.

Si vous constatez une augmentation de la latence de diffusion, vous pouvez vérifier la taille des messages à l'aide de la métrique topic/message_sizes, en regroupant les données par topic_id. Mettez en corrélation les pics de taille des messages avec les problèmes de performances observés.

Messages manquants

Si vous pensez que les messages ne sont pas distribués correctement à votre abonné, l'une des raisons suivantes peut en être la cause.

Distribution des messages dans les abonnements Pub/Sub avec plusieurs abonnés

Dans Pub/Sub, les messages peuvent être distribués de manière inégale entre les abonnés d'un même abonnement. Pub/Sub équilibre la charge des messages entre tous les clients actifs, mais l'objectif principal est de maximiser le débit global de traitement des messages et de minimiser le nombre de messages en attente, plutôt que d'assurer une distribution parfaitement uniforme. Le système dirige de manière dynamique davantage de messages vers les consommateurs qui font preuve d'une plus grande capacité (ceux qui accusent réception des messages rapidement et qui ne sont pas limités par leurs paramètres de contrôle du flux). Les consommateurs qui traitent les messages à des vitesses différentes ou qui fonctionnent dans des conditions différentes (par exemple, disponibilité des ressources, latence du réseau) sont susceptibles de traiter des volumes de messages différents. En général, les consommateurs plus rapides et plus réactifs recevront et traiteront une plus grande partie de la charge de messages.

Cette méthode de distribution à plusieurs consommateurs signifie que l'ordre dans lequel les messages sont reçus et traités peut varier. Par conséquent, à moins que l'ordonnancement des messages ne soit activé pour l'abonnement et que les éditeurs n'incluent des clés de tri, il n'est pas garanti que les messages soient traités par les abonnés dans l'ordre dans lequel ils ont été publiés.

Notez que des messages peuvent déjà être en attente pour les clients. Un backlog de messages non confirmés ne signifie pas nécessairement que vous recevrez ces messages lors de votre prochaine demande d'extraction d'extraction. Notez qu'un consommateur peut être une personne qui utilise l'extraction dans la console Google Cloud ou Google Cloud CLI, ou qui exécute un abonné personnalisé en local pour vérifier les messages.

Pour les clients Pull unaires, il est possible que certaines requêtes Pull renvoient zéro message. Comme indiqué dans la section Pas assez d'abonnés, il est recommandé de conserver plusieurs demandes d'extraction en attente, car certaines demandes peuvent renvoyer un nombre de messages inférieur au nombre maximal configuré, voire aucun message, même s'il existe un backlog. En effet, d'autres consommateurs peuvent détenir des baux sur les messages disponibles.

Si un consommateur n'accuse pas réception d'un message dans le délai de confirmation ou s'il envoie un accusé de réception négatif, Pub/Sub tente de le redistribuer. Cette tentative de réacheminement peut être effectuée auprès de n'importe quel consommateur actif de l'abonnement, et pas nécessairement celui qui l'a reçu initialement. Par conséquent, un ID de message particulier peut être distribué à plusieurs consommateurs différents connectés à l'abonnement au cours de sa durée de vie, et son traitement peut être tenté par plusieurs d'entre eux, jusqu'à ce que l'un d'eux l'accuse réception avec succès.

Si vous suspectez des comportements de distribution de messages inattendus, vérifiez si plusieurs consommateurs sont attachés simultanément à l'abonnement, puis examinez leurs configurations et leurs métriques de performances individuelles.

Filtrer l'abonnement

Vérifiez si un filtre est associé à l'abonnement. Si c'est le cas, vous ne recevrez que les messages correspondant au filtre. Le service Pub/Sub reconnaît automatiquement les messages qui ne correspondent pas au filtre. Réfléchissez à l'impact des filtres sur les métriques du backlog.

Utiliser l'option returnImmediately

Si votre client utilise Pull unaire, vérifiez si le champ returnImmediately est défini sur "true". Il s'agit d'un champ obsolète qui indique au service Pub/Sub de répondre immédiatement à la demande d'extraction, même s'il ne renvoie aucun message. Cela peut entraîner le renvoi de demandes d'extraction avec 0 message, même en cas de backlog.

Problèmes de configuration du client

Si vous utilisez la bibliothèque cliente Java et que vous initialisez votre abonné avec un canal gRPC personnalisé à l'aide de la méthode setChannelProvider(), vous devez vous assurer que le paramètre maxInboundMessageSize est d'au moins 20 Mo (ce qui correspond à la valeur par défaut de la bibliothèque) lorsque vous créez votre TransportChannelProvider. Lorsque cette valeur est inférieure à 10 Mo, les messages de taille supérieure à maxInboundMessageSize ne sont pas reçus correctement. InstantiatingGrpcChannelProvider.Builder.setMaxInboundMetadataSize() et ManagedChannelBuilder.maxInboundMetadataSize() sont des méthodes courantes pour configurer ce paramètre.

Gérer les doublons

La duplication des messages dans Pub/Sub se produit souvent lorsque les abonnés ne peuvent pas confirmer la réception des messages dans le délai de confirmation. Les messages sont alors rediffusés, ce qui donne l'impression qu'il y a des doublons. Vous pouvez mesurer le rythme auquel les abonnés dépassent le délai de confirmation à l'aide de la métrique subscription/expired_ack_deadlines_count. Découvrez comment surveiller l'expiration du délai de confirmation.

Pour réduire le taux de duplication, prolongez les délais des messages.

  • Les bibliothèques clientes gèrent automatiquement la prolongation du délai, mais des limites par défaut s'appliquent au délai maximal de prolongation que vous pouvez configurer.
  • Si vous créez votre propre bibliothèque cliente, utilisez la méthode modifyAckDeadline pour prolonger le délai de confirmation.

Si les messages sont extraits de l'abonné plus rapidement qu'ils ne peuvent être traités et accusés réception, certains messages peuvent expirer et nécessiter des extensions de délai. Toutefois, si l'abonné reste dépassé, les reports de délai répétés finissent par échouer. Dans le pire des cas, cela peut entraîner un afflux de doublons pour un abonné, ce qui aggrave le backlog. Les doublons qui expirent génèrent ensuite de nouveaux doublons.

Pour éviter de submerger l'abonné, réduisez le nombre de messages qu'il extrait à la fois. L'abonné a ainsi moins de messages à traiter dans le délai imparti. Moins de messages expirent et moins de messages sont réacheminés.

Pour réduire le nombre de messages que l'abonné extrait à la fois, vous devez réduire le paramètre "Nombre maximal de messages en attente" dans la configuration du contrôle de flux de votre abonné. Il n'existe pas de valeur universelle. Vous devez donc ajuster la limite maximale de messages en attente en fonction de votre débit et de votre capacité d'abonnés. N'oubliez pas que chaque application traite les messages différemment et prend un temps différent pour accuser réception d'un message.

Forcer les nouvelles tentatives

Pour forcer Pub/Sub à envoyer à nouveau un message, envoyez une requête nack. Si vous n'utilisez pas les bibliothèques clientes de haut niveau, envoyez une requête modifyAckDeadline avec un ackDeadlineSeconds défini sur 0.

Clés de tri

Lorsque Pub/Sub redistribue un message avec une clé de tri, il redistribue également tous les messages ultérieurs ayant la même clé de tri, même s'ils ont déjà été confirmés. Cela permet de conserver l'ordre de la séquence. Toutefois, il n'est pas strictement garanti que les messages dépendants ne sont envoyés qu'après l'accusé de réception réussi des messages précédents de la séquence.

L'abonné envoie un NACK pour les messages.

Consultez L'abonné envoie un NACK pour les messages.

Résoudre les problèmes liés à un abonnement StreamingPull

Relation entre la métrique de latence des requêtes et la latence de diffusion de bout en bout

Pour StreamingPull, la métrique serviceruntime.googleapis.com/api/request_latencies représente la durée pendant laquelle le flux est ouvert. Cette métrique n'est pas utile pour déterminer la latence de diffusion de bout en bout.

Au lieu d'utiliser la métrique de latence des requêtes, utilisez le score d'état de latence de distribution pour vérifier quels facteurs contribuent à l'augmentation de la latence de distribution de bout en bout.

Fermeture des connexions StreamingPull avec un état non OK

Les flux StreamingPull se ferment toujours avec un état non OK. Contrairement à un état d'erreur pour les RPC unaires, cet état pour StreamingPull est simplement une indication que le flux est déconnecté. Les demandes n'échouent pas. Par conséquent, bien que l'API StreamingPull ait un taux d'erreur de 100 % qui peut sembler surprenant, cela tient à sa conception.

Comme les flux StreamingPull se terminent toujours par une erreur, il est inutile d'examiner les métriques de fin de flux lors du diagnostic des erreurs. Concentrez-vous plutôt sur la métrique de réponse StreamingPull subscription/streaming_pull_response_count, regroupée par response_code ou response_class.

Recherchez les erreurs suivantes :

  • Des erreurs Failed precondition peuvent se produire si des messages compris dans les tâches d'abonnement en attente sont chiffrés avec une clé Cloud KMS désactivée. Pour reprendre l'extraction, rétablissez l'accès à la clé.

  • Des erreurs d'indisponibilité peuvent se produire lorsque Pub/Sub ne parvient pas à traiter une requête. Il s'agit probablement d'une condition temporaire. La bibliothèque cliente relance les requêtes. Aucune action n'est requise de votre part si vous utilisez une bibliothèque cliente.

  • Des erreurs "Introuvable" peuvent se produire lorsque l'abonnement est supprimé ou s'il n'a jamais existé. Ce dernier cas se produit si vous avez fourni un chemin d'abonnement non valide.

Autres références