J'essaie de créer une fonction google cloud qui charge des données dans une API. Leurs guides montrent des exemples sur la façon d'éviter des tentatives infinies ( https : //cloud.google.com/functions/docs/bestpractices/retries#functions-tips-retry-node6 ), mais je ne trouve pas de guide expliquant comment mettre en œuvre une interruption incrémentielle.
Si l'API tombe en panne, la fonction GCP semble réessayer aussi vite que possible. L'option idéale serait d'avoir un délai croissant à mesure que le nombre de tentatives augmente.
Quelqu'un a-t-il des exemples de code (nœud) pour implémenter cela? Sinon, coder une explication ou un plan d'attaque aiderait également.
Recherche la documentation en vain.
3 Réponses :
if(eventAge < 1000 && eventAge > 0) { //Do stuff }else if (eventAge < 3000 && eventAge > 1000) { // Do stuff }(...) else{ return; }
Il semble que la fonction sera toujours réessayée de force. Vous pouvez cependant vous assurer que la partie réellement importante de la fonction est appelée dans un intervalle d'attente.
Procédez simplement comme suit:
/** * Background Cloud Function that only executes within * a certain time period after the triggering event * * @param {object} event The Cloud Functions event. * @param {function} callback The callback function. */ exports.avoidInfiniteRetries = (event, callback) => { const eventAge = Date.now() - Date.parse(event.timestamp); const eventMaxAge = 10000; // Ignore events that are too old if (eventAge > eventMaxAge) { console.log(`Dropping event ${event} with age ${eventAge} ms.`); callback(); return; } // Do what the function is supposed to do console.log(`Processing event ${event} with age ${eventAge} ms.`); callback(); };
De cette façon, votre le code ne sera exécuté que dans les intervalles que vous avez définis via la logique.
D'où vient la pause? Cela va-t-il simplement réexécuter continuellement la fonction jusqu'à ce que la condition de synchronisation soit remplie? J'ai pensé à ajouter un délai dans la fonction, mais cela semble inefficace. Je suppose que cela pourrait fonctionner si je peux passer # de tentatives au prochain appel.
Ouais c'est l'idée. Tant que vous avez votre logique réelle dans les blocs de tentatives, vous n'avez pas à vous soucier des tentatives infinies sur votre code réel. Laisser google réessayer tant qu'il le veut lol
SetTimeout pourrait fonctionner mais si la fonction échoue réellement sur une autre erreur non interceptée, elle ne réessaiera pas
En fait, cela ne garantirait pas son appel une seule fois à chaque intervalle. La fonction sera probablement appelée de manière continue jusqu'à ce que la plage de chaque condition ne soit plus remplie. Ce qui signifie que ce serait quelque chose comme ceci: 5 appels dans la première seconde .... 3 appels après 3 secondes, 7 appels après 10 secondes, etc. Je ne sais pas exactement comment résoudre ce problème.
En plus de la documentation officielle que vous avez examinée. Vous pouvez essayer de consulter ce document [1] même s'il est spécifié pour Cloud IoT Core. Vous trouverez différents exemples en fonction de votre environnement d'exécution. Cela peut aider à illustrer comment un recul exponentiel peut être mis en œuvre.
[1] https://cloud.google.com/ iot / docs / how-tos / exponential-backoff
Donc, cela spécifie comment le gérer lors d'un appel à Google, mais pas lors d'un appel à partir d'une fonction Google. Il exploite setTimeout qui est une mauvaise pratique avec FaaS. De plus, il utilise en mémoire des compteurs pour les tentatives où les fonctions GCP sont arrêtées, puis réexécutées à chaque nouvelle tentative. Je ne sais pas comment cela pourrait être exploité.
En consultant la documentation relative aux GCS , il y a une assez bonne explication sur la troncature retard exponentiel.
Cependant, plus intéressant encore, il déclare:
Les bibliothèques clientes Google Cloud pour Node.js peuvent utiliser automatiquement stratégies d'interruption pour réessayer les demandes avec le paramètre autoRetry.
Ainsi, en recherchant n'importe quelle bibliothèque @ google-cloud
aléatoire et en recherchant cette option, nous sommes dirigés vers ce morceau de code gérant les retraits.
Étant donné que ce code est sous la Licence Apache 2.0 , Je suppose que vous pouvez simplement copier cet extrait de code, à condition de respecter les limitations de licence.
Cloud Functions gère en interne la fréquence des tentatives. Cela déterminera le recul. Vous n'avez actuellement aucun contrôle sur la façon dont cela fonctionne.