AWS Lambda + API externe : pourquoi plus de retries n'a pas réglé mes erreurs 409
Bonjour à tous,
Un retour d'expérience sur un bug qui m'a appris beaucoup sur le serverless.
Le contexte
Un connecteur Node.js / TypeScript sur AWS Lambda qui écrit dans Contentful (catégories, SEO, méga-menu) à partir des événements du système.
Le problème
Contentful protège chaque entrée avec un numéro de version. Si deux Lambdas lisent la version 12 en même temps, la première écrit la version 13. La deuxième essaie d'écrire avec la version 12 et reçoit une erreur 409 VersionMismatch. Le méga-menu se retrouve à moitié à jour.
Ajouter des retries ne règle rien. Le vrai problème, c'est qu'il y a deux écrivains en même temps.
La solution
Une file SQS FIFO avec un MessageGroupId : les messages d'un même groupe passent dans l'ordre.
Une concurrence à 1 sur cette Lambda : un seul écrivain à la fois sur la ressource.
Une clé d'idempotence : si un message arrive deux fois, la deuxième fois il ne fait rien.
Des écritures par lots, pour rester sous le rate limit de l'API.
La leçon
Le serverless rend le parallélisme très facile. Parfois, la bonne réponse est de le limiter.
Vous avez déjà eu ce genre de conflit avec une API externe ? Vous l'avez réglé comment : verrou, file d'attente, autre chose ?