Quand cinq pour cent du trafic en dit plus qu'un environnement de staging
Il y a quelques semaines, une équipe que je connais a déployé un nouveau flux d'authentification. L'environnement de staging affichait des tests verts, des temps de réponse acceptables et aucune erreur. Ils ont promu le build en production, redirigeant tous les utilisateurs vers la nouvelle version en quelques minutes. Trente minutes plus tard, les tickets de support s'accumulaient. Les utilisateurs d'une région spécifique ne pouvaient pas se connecter. L'environnement de staging n'a jamais détecté le problème, car il ne reproduisait ni les schémas de trafic réalistes, ni la latence régionale, ni la diversité des appareils présents en production.
L'équipe a fait un rollback, mais les dégâts étaient faits. Les utilisateurs ont perdu confiance, et l'équipe a passé les deux jours suivants à déboguer un problème qui n'apparaissait que dans des conditions de production réelles.
C'est l'écart que les stratégies de déploiement progressif tentent de combler. Au lieu d'activer le changement pour tout le monde d'un coup, vous exposez d'abord un petit sous-ensemble d'utilisateurs ou de trafic à la nouvelle version. Vous observez ce qui se passe. Ensuite, vous décidez de continuer, de faire une pause ou de revenir en arrière.
Deux stratégies courantes pour cela sont les canary releases et les rollouts par étapes. Elles semblent similaires, mais elles résolvent des problèmes différents. Comprendre la différence vous aide à choisir la bonne approche pour chaque modification que vous livrez.
Canary Releases : laissez le trafic décider
Une canary release commence par router un faible pourcentage du trafic vers la nouvelle version. Imaginez que votre application reçoive cent requêtes par seconde. Vous configurez votre répartiteur de charge ou votre service mesh pour envoyer cinq de ces requêtes vers les serveurs exécutant la nouvelle version. Les quatre-vingt-quinze requêtes restantes continuent de frapper l'ancienne version.
Vous surveillez ensuite les signaux clés : taux d'erreur, latence, utilisation CPU, performances des requêtes en base de données. Si la nouvelle version semble saine après quelques minutes, vous augmentez la part de trafic à dix pour cent, puis vingt, puis cinquante, et finalement cent pour cent.
L'idée centrale ici est que la répartition est probabiliste. N'importe quel utilisateur peut se retrouver sur la nouvelle version s'il est la cinquième requête sur cent. Les utilisateurs ne savent pas quelle version ils utilisent, et cela ne devrait pas les préoccuper tant que l'application fonctionne.
Les canary releases sont utiles lorsque vous voulez valider la stabilité d'un changement sous une charge de production réelle. Les environnements de staging sont parfaits pour détecter les erreurs logicielles, mais ils ne peuvent pas reproduire le chaos de la production : pics de trafic irréguliers, connexions lentes à la base de données depuis certaines régions, ou limites de débit d'API tierces qui n'apparaissent qu'en charge.
Cette stratégie est idéale pour les changements à haut risque. Les réécritures majeures de logique métier, les migrations de schéma de base de données, les mises à jour de bibliothèques qui touchent au réseau ou à la concurrence, ou les modifications du comportement du cache sont de bons candidats pour les canary releases. Si quelque chose tourne mal, seule une petite fraction des utilisateurs est affectée, et vous pouvez rapidement drainer le trafic de la nouvelle version.
Rollouts par étapes : choisissez qui reçoit la mise à jour en premier
Les rollouts par étapes adoptent une approche différente. Au lieu de répartir le trafic de manière aléatoire, vous décidez quels groupes d'utilisateurs reçoivent la nouvelle version en premier. Ces groupes sont souvent appelés des anneaux.
L'anneau un peut contenir votre équipe interne et une poignée de bêta-testeurs. L'anneau deux pourrait être un pourcentage d'utilisateurs dans une région spécifique ou avec un type d'appareil particulier. L'anneau trois pourrait être tous les utilisateurs du niveau gratuit. L'anneau quatre pourrait être les clients entreprise avec des SLA stricts.
Le déploiement progresse à travers ces anneaux uniquement lorsque l'anneau précédent ne présente aucun problème critique. Si l'anneau un signale un problème, vous faites une pause avant d'étendre. Si l'anneau deux montre des taux d'erreur élevés, vous revenez en arrière avant d'atteindre l'anneau trois.
La principale différence avec les canary releases est l'intentionnalité. Vous choisissez qui reçoit la nouvelle version, pas seulement combien de trafic. Cela compte lorsque différents groupes d'utilisateurs ont des attentes, des schémas d'utilisation ou des obligations contractuelles différents.
Par exemple, si votre application sert à la fois des utilisateurs individuels et de grands clients entreprise avec des SLA signés, vous ne voulez probablement pas router accidentellement une requête d'entreprise vers une nouvelle version boguée. Un rollout par étapes vous permet de tester le changement d'abord sur des utilisateurs moins critiques, puis de l'étendre aux clients à forte valeur ajoutée seulement après avoir acquis la certitude.
Les rollouts par étapes fonctionnent également bien pour les versions d'applications mobiles. Vous ne pouvez pas facilement contrôler le trafic au niveau réseau pour les applications mobiles. Au lieu de cela, vous publiez la mise à jour auprès d'un petit pourcentage d'utilisateurs via la fonction de déploiement progressif de l'app store, vous surveillez les rapports de crash et les évaluations, puis vous étendez à davantage d'utilisateurs.
Combiner les deux stratégies
En pratique, les canary releases et les rollouts par étapes ne s'excluent pas mutuellement. De nombreuses équipes les combinent en un seul pipeline de déploiement progressif.
Le diagramme ci-dessous montre les deux stratégies côte à côte et comment elles peuvent être enchaînées.
Le pipeline peut commencer par une canary release à cinq pour cent du trafic pour valider la stabilité technique. Si la canary réussit, le pipeline passe à un rollout par étapes : d'abord aux utilisateurs internes, puis aux bêta-testeurs, puis à un pourcentage d'utilisateurs de production, et enfin à tout le monde.
Cette approche combinée vous offre deux couches de sécurité. La canary détecte les problèmes au niveau de l'infrastructure, comme les fuites mémoire ou les requêtes lentes en base de données. Le rollout par étapes détecte les problèmes côté utilisateur, comme des workflows cassés pour certains types de comptes ou certaines régions.
Un pipeline de déploiement progressif bien conçu peut automatiser ces décisions. Il surveille les métriques que vous définissez, les compare à des seuils, et soit passe à l'étape suivante, soit met le déploiement en attente pour une revue manuelle, soit déclenche un rollback automatique.
Ce dont vous avez besoin avant de commencer
Les stratégies de déploiement progressif ne sont aussi utiles que les données que vous utilisez pour prendre des décisions. Sans une bonne observabilité, une canary release n'est qu'un moyen plus lent de casser la production.
Vous avez besoin :
- D'une surveillance du taux d'erreur en temps réel, ventilée par version
- Des percentiles de latence pour la nouvelle version par rapport à l'ancienne
- De métriques métier qui comptent pour votre produit, comme le taux de conversion ou l'achèvement d'inscription
- D'un moyen de corréler les rapports utilisateurs avec la version qu'ils exécutent
Vous avez également besoin de la capacité de revenir en arrière rapidement. Si la canary montre des problèmes, vous devez pouvoir drainer le trafic de la nouvelle version en quelques secondes, pas en heures. Cela nécessite une infrastructure qui prend en charge le déplacement de trafic, comme un répartiteur de charge, un service mesh ou un système de feature flags.
Une liste de contrôle pratique rapide
Si vous mettez en place un déploiement progressif pour la première fois, voici une courte liste pour guider votre implémentation :
- Commencez par une seule stratégie. Choisissez les canary releases si vous vous souciez de la stabilité technique sous charge de production. Choisissez les rollouts par étapes si vous devez contrôler quels utilisateurs voient le changement en premier.
- Définissez des critères de go/no-go clairs avant de commencer. Quel taux d'erreur est acceptable ? Quelle augmentation de latence est trop élevée ? Notez ces seuils et configurez-les dans votre pipeline.
- Assurez-vous que votre surveillance couvre à la fois les métriques techniques et les métriques métier. Une canary peut n'afficher aucune erreur mais quand même casser votre flux de paiement si les utilisateurs ne peuvent pas finaliser leurs achats.
- Entraînez-vous au rollback. N'attendez pas qu'un problème survienne pour découvrir que votre déplacement de trafic prend dix minutes.
- Ne combinez les stratégies qu'après vous être familiarisé avec chacune individuellement. Un pipeline combiné ajoute de la complexité, et vous voulez comprendre chaque couche avant de les empiler.
L'essentiel à retenir
Les canary releases et les rollouts par étapes ne consistent pas à être prudent pour le plaisir d'être prudent. Il s'agit d'apprendre ce que la production fait réellement à votre code avant qu'il n'atteigne tout le monde. Un environnement de staging vous donne confiance dans vos tests. Une canary ou un rollout par étapes vous donne confiance dans la réalité.
Commencez par une stratégie, instrumentez vos métriques, et laissez les données vous dire quand continuer. L'objectif n'est pas d'éliminer complètement le risque. L'objectif est de contenir le risque à un petit groupe d'utilisateurs, d'en tirer des leçons, et de n'étendre que lorsque vous êtes sûr.