Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Meilleures pratiques pour les fonctions durables de Lambda
Les fonctions durables utilisent un modèle d'exécution basé sur le replay qui nécessite des modèles différents de ceux des fonctions Lambda traditionnelles. Suivez ces meilleures pratiques pour créer des flux de travail fiables et rentables.
Écrire du code déterministe
Pendant la réexécution, votre fonction s'exécute depuis le début et doit suivre le même chemin d'exécution que l'exécution initiale. Le code en dehors des opérations durables doit être déterministe et produire les mêmes résultats avec les mêmes entrées.
Répartissez les opérations non déterministes par étapes :
Génération de nombres aléatoires et UUIDs
Heure actuelle ou horodatage
Appels d'API externes et requêtes de base de données
Opérations du système de fichiers
Important
N'utilisez pas de variables globales ou de fermetures pour partager l'état entre les étapes. Transmettez les données via les valeurs de retour. L'état global se brise pendant la rediffusion car les étapes renvoient les résultats mis en cache mais les variables globales sont réinitialisées.
Évitez les mutations de fermeture : les variables capturées lors des fermetures peuvent perdre des mutations pendant la rediffusion. Les étapes renvoient les résultats mis en cache, mais les mises à jour des variables en dehors de l'étape ne sont pas reproduites.
Conception axée sur l'idempuissance
Les opérations peuvent être exécutées plusieurs fois en raison de nouvelles tentatives ou de rediffusions. Les opérations non idempotentes entraînent des effets secondaires dupliqués, comme le fait de facturer deux fois les clients ou d'envoyer plusieurs e-mails.
Utilisez des jetons d'idempuissance : générez des jetons en quelques étapes et incluez-les dans les appels d'API externes pour éviter les opérations dupliquées.
Utilisez la at-most-once sémantique : pour les opérations critiques qui ne doivent jamais être dupliquées (transactions financières, déductions d'inventaire), configurez at-most-once le mode d'exécution.
Identité de la base de données : utilisez check-before-write des modèles, des mises à jour conditionnelles ou des opérations de modification pour éviter les doublons d'enregistrements.
Gérez efficacement l'état
Chaque point de contrôle enregistre l'état dans un stockage permanent. Les objets d'état volumineux augmentent les coûts, ralentissent le pointage des points de contrôle et ont un impact sur les performances. Stockez uniquement les données essentielles de coordination du flux de travail.
Maintenez l'état au minimum :
Magasin IDs et références, pas des objets complets
Récupérez des données détaillées en quelques étapes, selon les besoins
Utilisez Amazon S3 ou DynamoDB pour les données volumineuses, transmettez les références dans l'état
Évitez de transmettre de grosses charges utiles entre les étapes
Concevez des étapes efficaces
Les étapes sont l'unité de travail fondamentale des fonctions durables. Des étapes bien conçues facilitent la compréhension, le débogage et la maintenance des flux de travail.
Principes de conception des étapes :
Utilisez des noms descriptifs : les noms tels que
validate-order«step1instead » facilitent la compréhension des journaux et des erreursConservez les noms statiques : n'utilisez pas de noms dynamiques avec des horodatages ou des valeurs aléatoires. Les noms des étapes doivent être déterministes pour la rediffusion
Équilibrez la granularité : divisez les opérations complexes en étapes ciblées, mais évitez les petites étapes excessives qui augmentent la charge des points de contrôle
Opérations liées au groupe - Les opérations qui devraient réussir ou échouer ensemble appartiennent à la même étape
Utilisez efficacement les opérations d'attente
Les opérations d'attente suspendent l'exécution sans consommer de ressources ni entraîner de coûts. Utilisez-les au lieu de faire fonctionner Lambda.
Attentes basées sur le temps : à utiliser context.wait() pour les retards au lieu de setTimeout ou. sleep
Rappels externes : à utiliser context.waitForCallback() lorsque vous attendez des systèmes externes. Définissez toujours des délais d'attente pour éviter les temps d'attente indéfinis.
Sondage : context.waitForCondition() à utiliser avec un recul exponentiel pour interroger les services externes sans les surcharger.
Considérations supplémentaires
Gestion des erreurs : réessayez les échecs transitoires tels que les délais d'expiration du réseau et les limites de débit. Ne réessayez pas en cas d'échec permanent, comme une saisie non valide ou une erreur d'authentification. Configurez des stratégies de nouvelles tentatives avec des taux de tentatives et d'interruption maximaux appropriés. Pour des exemples détaillés, voir Gestion des erreurs et nouvelles tentatives.
Performances : minimisez la taille des points de contrôle en stockant des références plutôt que des charges utiles complètes. Utilisez context.parallel() et context.map() pour exécuter simultanément des opérations indépendantes. Opérations liées au batch pour réduire la surcharge des points de contrôle.
Gestion des versions : invoquez des fonctions avec des numéros de version ou des alias pour attribuer les exécutions à des versions de code spécifiques. Assurez-vous que les nouvelles versions du code peuvent gérer l'état des anciennes versions. Ne renommez pas les étapes et ne modifiez pas leur comportement de manière à interrompre la rediffusion.
Sérialisation : utilisez des types compatibles JSON pour les entrées et les résultats des opérations. Convertissez les dates en chaînes ISO et les objets personnalisés en objets simples avant de les transmettre à des opérations durables.
Surveillance : activez la journalisation structurée avec les noms d'exécution IDs et d'étape. Configurez CloudWatch des alarmes pour les taux d'erreur et la durée d'exécution. Utilisez le traçage pour identifier les goulots d'étranglement. Pour obtenir des instructions détaillées, consultez la section Surveillance et débogage.
Tests : testez le chemin heureux, la gestion des erreurs et le comportement des rediffusions. Testez des scénarios de temporisation pour les rappels et les temps d'attente. Utilisez des tests locaux pour réduire le temps d'itération. Pour obtenir des instructions détaillées, voir Tester des fonctions durables.
Erreurs courantes à éviter : n'imbriquez pas les context.step() appels, utilisez plutôt des contextes enfantins. Enveloppez les opérations non déterministes par étapes. Définissez toujours des délais d'expiration pour les rappels. Équilibrez la granularité des étapes avec la surcharge des points de contrôle. Stockez les références plutôt que les objets volumineux dans l'état.
Ressources supplémentaires
Documentation du SDK Python
- Référence complète des API, modèles de test et exemples avancés TypeScript Documentation du SDK
: référence complète des API, modèles de test et exemples avancés