Rollback stratégies et versions atomiques
Rollback Stratégies et versions atomiques
1) Pourquoi avez-vous besoin d'un retour rapide
Même avec une excellente couverture de test, la prod ne garantit pas l'authenticité. Rollback est le retour contrôlé du système à l'état stable précédent par le signal SLO/métriques d'entreprise ou d'incident. Objectifs :- Réduire le MTTR en minutes.
- Limiter le rayon d'impact (minimum d'utilisateurs/transactions concernés).
- Préserver l'intégrité des données et l'interopérabilité des contrats.
La clé : construire des sorties de sorte que le retrait soit une action triviale et non un mini-projet.
2) La notion de « libération atomique »
Sortie atomique - lorsque l'inclusion d'une nouvelle version/comportement peut être effectuée (et annulée) par une seule opération atomique sans effets secondaires durables.
Composants de l'atomicité :- Artefact immutable (image signée/paquet).
- Configis versionnés (version promotionnelle, pas édition manuelle).
- Séparer « livraison » de « activation » (routage/drapeaux).
- Schéma de données compatible (les deux versions peuvent vivre simultanément).
- Runbook de retour : une étape compréhensible (changement de sélecteur/poids/drapeau) + vérification.
3) Inventaire des mécanismes de rollback
3. 1 Niveau trafic (le plus rapide)
Bleu-Vert : Changer le sélecteur/groupe cible pour une version stable.
Canary : abaisser le poids à 0 % et geler la progression.
Gateway/NGINX/Service Mesh : récupérer les anciens poids/itinéraires.
3. 2 Niveau convoyeur
Helm/Argo Rollouts : 'abort/rollback' à la révision précédente.
GitOps : revert MR/commit dans le référentiel manifeste (le contrôleur fera le reste).
3. 3 Annexe/fiches
Feature-flags/kill-switch : désactiver instantanément le chemin risqué.
Toggle confights : retour à la précédente config snapshot.
3. 4 Données
Migration roll-forward (préférée) + compatibilité.
Récupération point-in-time (PITR) et backup pour les accidents.
Compensation (Saga) et idempotency pour les actions réversibles.
4) Modèle « expand → migrate → contract » (OBD)
Pour que le retour en arrière soit sûr, le schéma de données doit permettre aux anciennes et nouvelles versions de vivre.
1. Expand - ajouter de nouveaux champs/index (nullable) sans briser l'ancienne logique.
2. Migrate - double écriture/lecture, back-fill, job's d'arrière-plan avec idempotency.
3. Contrat : Supprime les anciens champs/code après la sortie à 100 % et la fenêtre maintenue.
5) SLO-Gating et auto-back
L'entrée de chaque étape de sortie doit être « surveillée » par des métriques.
SLO technique : p95/p99 latence, 5xx-rate, saturation (CPU/Mémoire), error-budget burn.
Mesures d'affaires : CR sur le dépôt/cassout, refus de paiement, pourcentage de frod, erreurs KYC.
- 5xx > 0. 5 % 10 minutes → rollback.
- p95 ↑> 20 % de la → de base hold + analyse.
- Erreur dans PSP> 0. 3 pp → rollback + changement d'itinéraire de paiement.
6) Exemples : Kubernetes/Helm/Argo/NGINX
6. 1 Blue-Green (K8s Service selector)
yaml
Service points to "blue"; switch to green - change selector apiVersion: v1 kind: Service metadata: {name: app-svc}
spec:
selector: { app: app, version: blue }
ports: [{ port: 80, targetPort: 8080 }]
Retour en arrière = ramener le sélecteur à 'blue' (atomique, sans recalage).
6. 2 Canary (Istio VirtualService веса)
yaml http:
- route:
- destination: { host: app, subset: stable } # 100 weight: 100
- destination: { host: app, subset: canary } # 0 weight: 0
Retour en arrière = canary weight → 0, stable → 100.
6. 3 Argo Rollouts — abort
yaml kubectl argo rollouts abort app # stop and return to stableService
6. 4 Helm - rollback à la révision
bash helm history app -n prod helm rollback app 17 -n prod # revert to revision 17
6. 5 NGINX - poids upstream
nginx upstream app {
server blue:8080 weight=100;
server green: 8080 weight = 0; # rollback - return 100/0
}
7) Feature-flags et kill-switch comme « parachute »
Kill-switch pour les flux à haut risque (dépôts/paiements/bonus) est obligatoire.
Stick....: attribuer aux utilisateurs une « option » via une clé de hachage - comparaisons prévisibles.
Fail-safe : Si le serveur de drapeaux n'est pas disponible, le défaut est sécurisé.
ts const enabled = flags. bool("new_cashout_flow", false);
if (! enabled) return classicFlow () ;//instant rollback - disable the return newFlow () flag;
8) Contrats API et événements : comment ne pas « casser le dos »
Versez les contrats (OpenAPI/gRPC/Avro) : la nouvelle version ajoute des champs, ne change pas la sémantique des anciens.
Event-versioning : 'type = v2', les consommateurs sont obligés d'ignorer les champs inconnus.
Outbox + Idempotency : toute répétition d'événement est sûre, le consommateur est idempotente.
9) Transactions compensatoires (Saga)
Lorsqu'il n'y a pas d'état « dur » (l'argent est parti, l'e-mail a été envoyé), utilisez la compensation :- L'indemnisation a été débitée : retour, annulation, enregistrement correctif.
- Entrez dans le journal des opérations de compensation et des retraits avant le succès.
- Clés idempotentes pour chaque opération.
json
{
"sagaId": "b7d2...",
"action": "withdraw. execute",
"idempotencyKey": "user123:withdraw:7845",
"compensation": "withdraw. refund"
}
10) Configis et secrets : retour en arrière comme version
Gardez les configis comme des artefacts avec des versions (semver/commit-sha).
Retour en arrière = Retour à la version précédente (GitOps revert) au lieu de « réparer avec les mains ».
Secrets - via le stockage (KMS/Vault) ; la rotation et le versioning sont inclus dans la version.
11) Runbook de retour (minimum)
1. Pause de progression (canary/rollouts).
2. Retour du trafic (poids/sélecteur).
3. La validation des métriques SLO/Business est revenue à la base.
4. Stabilisation des job's de fond (arrêter les migrations/back-fill si nécessaire).
5. Incident et post-faits : artefacts (logs/tracks/métriques), hypothèses, correction.
6. Purge : fermez les drapeaux, supprimez le code laissé, retournez les horaires de job.
12) Politiques de protection automatique
L'interdiction de « latest » et de balises mutables pour les images.
Contrôle d'admission : seulement les artefacts signés.
Porte CI : SAST/SCA/Policy-checks doivent être verts pour la promotion.
Fenêtres Freeze : Interdiction des sorties/poids> X % pendant les périodes à risque.
13) Anti-modèles fréquents
« Reculons » la base DDL-Down au lieu de la compatibilité - de longs verrous/simple.
Migrations instantanées « sur le front » sans idempotency et back-fill.
Mélanger « livraison » et « activation » - il n'est pas possible de récupérer rapidement le trafic.
Modifications manuelles dans un configh sans audit.
Aucun kill-switch sur les paiements/retraits.
L'artefact pour prod (violation de « build once - run many »).
Il n'y a pas de bouton unique de retour/runbook non travaillé.
14) Chèque de mise en œuvre (0-45 jours)
0-10 jours
Activer Blue-Green/Canary sur les services clés.
Désactiver 'latest', inclure la signature d'image et l'historique Helm/Argo.
Connectez les panneaux SLO (latency, 5xx, signaux d'affaires clés).
11-25 jours
Implémenter kill-switch pour le risque-flow.
Convertir les migrations OBD en expand-migrate-contract + idempotency.
Ajouter un auto-stop/rollback par SLO (Argo AnalysisTemplate/alerts).
26-45 jours
Versioner les confighs (GitOps), revenir en arrière via MR-revert.
Runbook sur « game-day » (simulation d'incident et de retour en arrière).
Entrez une compensation Saga là où le retour vers le bas n'est pas possible.
15) Métriques de maturité
MTTR de retour : cible <5 min.
% de sorties où le recul = changement de route/drapeau (pas de recalage)> 90 %.
Taux de migration selon le schéma expand-migrate-contract> 90%.
Couverture des services kill-switch avec des drapeaux> 95 %.
Nombre d'incidents dus à des schémas/contrats incompatibles → 0.
16) Applications : Mini-modèles
Analyse ArgoTemplate : stop à 5xx
yaml apiVersion: argoproj. io/v1alpha1 kind: AnalysisTemplate metadata: { name: guard-5xx }
spec:
metrics:
- name: http_5xx_rate interval: 1m successCondition: result < 0. 005 provider:
prometheus:
address: http://prometheus. monitoring:9090 query:
sum(rate(http_requests_total{app="app",status=~"5.."}[5m])) /
sum(rate(http_requests_total{app="app"}[5m]))
Kubernetes : Speed Deployment
bash kubectl rollout undo deploy/app -n prod
Helm : sortie atomique
bash helm upgrade --install app chart/ \
--atomic \
--timeout 5m \
--set image. tag=v1. 9. 3
NGINX : « grue » pour les canaris
nginx map $cookie_canary $weight {
default 0;
"~ on" 10; # enable 10% by cookie
}
17) Conclusion
Un retour fiable n'est pas un « bouton incendie », mais une propriété de l'architecture : artefacts immuables, séparation de la livraison et de l'allumage, schéma de données compatible, drapeaux de ficha et jeu SLO. Construisez des versions atomiques, répliquez le runbook et automatisez la porte de sécurité - et toute version deviendra réversible en quelques minutes, sans douleur pour les entreprises et les utilisateurs.