Les bibliothèques Python de Google Cloud sont conçues pour la résilience. Ils ajoutent des mécanismes de nouvelle tentative puissants pour gérer efficacement les erreurs transitoires. Cependant, il peut arriver que le comportement de nouvelle tentative par défaut ne soit pas adapté. Par exemple, vous pourriez rencontrer certaines erreurs qui ne devraient pas déclencher de nouvelle tentative, ou vous pourriez avoir besoin de plus de contrôle sur la logique de nouvelle tentative.
Cet article de blog explore la manière dont les bibliothèques Python de Google Cloud interagissent avec les prédicats de nouvelle tentative personnalisés, vous permettant ainsi de personnaliser le comportement des nouvelles tentatives afin de mieux répondre à vos besoins spécifiques.
Dans cet article de blog, je souhaite mettre en évidence un exemple spécifique lié à l'utilisation de l'usurpation d'identité de compte de service dans les bibliothèques Google Cloud. Dans une architecture que j'ai conçue et sur laquelle je travaille actuellement, nous isolons les environnements utilisateur dans des projets Google Cloud distincts. Nous avons constaté que certains de nos services connaissaient des performances dégradées dans certains flux utilisateurs. Après enquête, nous avons remonté le problème au comportement de nouvelle tentative par défaut des bibliothèques mentionnées précédemment.
Avant de passer à la personnalisation, il est important de comprendre le comportement de nouvelle tentative par défaut des bibliothèques Google Cloud Python. Ces bibliothèques ont généralement une stratégie d'attente exponentielle avec une instabilité supplémentaire pour les tentatives. Cela signifie que lorsqu'une erreur passagère se produit, la bibliothèque réessayera l'opération après un bref délai, le délai augmentant de façon exponentielle après chaque tentative ultérieure. L'inclusion de la gigue introduit un caractère aléatoire dans le délai, ce qui permet d'empêcher la synchronisation des tentatives sur plusieurs clients.
Bien que cette stratégie soit efficace dans de nombreuses situations, elle n'est peut-être pas idéale pour tous les scénarios. Par exemple, si vous utilisez l'usurpation d'identité de compte de service et que vous rencontrez une erreur d'authentification, tenter de réessayer l'opération peut ne pas être utile. Dans de tels cas, le problème d'authentification sous-jacent doit probablement être résolu avant qu'une nouvelle tentative puisse réussir.
Dans les bibliothèques Google Cloud, les prédicats de nouvelle tentative personnalisés vous permettent de spécifier les conditions précises dans lesquelles une nouvelle tentative doit être effectuée. Vous pouvez créer une fonction qui accepte une exception en entrée et renvoie True si l'opération doit être réessayée, et False si elle ne doit pas être tentée.
Par exemple, voici un prédicat de nouvelle tentative personnalisé qui empêche les nouvelles tentatives pour certaines erreurs d'authentification qui se produisent lors de l'usurpation d'identité du compte de service :
from google.api_core.exceptions import GoogleAPICallError from google.api_core.retry import Retry, if_transient_error def custom_retry_predicate(exception: Exception) -> bool: if if_transient_error(exception): # exceptions which should be retried if isinstance(exception, GoogleAPICallError): if "Unable to acquire impersonated credentials" in exception.message: # look for specific impersonation error return False return True return False
Ce prédicat vérifie si l'exception est une GoogleAPICallError et recherche spécifiquement le message « Impossible d'acquérir des informations d'identification usurpées ». Si cette condition est remplie, il renvoie False, empêchant une nouvelle tentative.
Firestore :
from google.api_core.exceptions import GoogleAPICallError from google.api_core.retry import Retry, if_transient_error def custom_retry_predicate(exception: Exception) -> bool: if if_transient_error(exception): # exceptions which should be retried if isinstance(exception, GoogleAPICallError): if "Unable to acquire impersonated credentials" in exception.message: # look for specific impersonation error return False return True return False
BigQuery :
from google.cloud import firestore # ... your Firestore setup ... retry = Retry(predicate=custom_retry_predicate, timeout=10) # example of an arbitrary firestore api call, works with all stream = collection.stream(retry=retry)
Dans les deux exemples, nous créons un objet Retry avec notre prédicat personnalisé et une valeur de délai d'attente. Cet objet Retry est ensuite transmis en argument aux appels d'API respectifs.
Les prédicats de nouvelle tentative personnalisés offrent un moyen efficace d'améliorer la résilience de vos applications Google Cloud. En personnalisant le comportement des nouvelles tentatives en fonction de vos besoins spécifiques, vous pouvez garantir que vos applications sont robustes, efficaces et évolutives. Prenez en charge la gestion de vos erreurs et maîtrisez le processus de nouvelle tentative !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!