Kill Switch : Désactiver une fonctionnalité défaillante sans rollback

Vous venez d'ouvrir une nouvelle fonctionnalité à dix pour cent de vos utilisateurs. Cinq minutes plus tard, les rapports d'erreur affluent. La fonctionnalité casse le chargement des pages pour certains utilisateurs, corrompt les données pour d'autres. Chaque seconde où elle reste active, davantage d'utilisateurs sont impactés. Votre instinct vous pousse peut-être à effectuer un rollback complet du déploiement, mais cela prend du temps : le pipeline doit s'exécuter, les images doivent être poussées, les serveurs doivent redémarrer. Pendant ce temps, les utilisateurs continuent de subir le code défaillant.

C'est là qu'un kill switch devient votre frein d'urgence.

Ce que fait réellement un Kill Switch

Un kill switch est un mécanisme qui vous permet de désactiver une fonctionnalité problématique sans revenir à une version antérieure de l'application. Si vous utilisez des feature flags, un kill switch consiste simplement à changer la valeur d'un flag de true à false. Au moment où ce flag bascule, votre application commence à exécuter l'ancien chemin de code. Les utilisateurs qui voyaient la nouvelle fonctionnalité retournent à l'ancienne interface ou au flux précédent. Pas de redéploiement. Pas de rollback. Pas d'attente qu'un pipeline se termine.

La différence entre un kill switch et un rollback est fondamentale. Un rollback ramène l'ensemble de l'application à une version antérieure. Cela signifie que chaque modification livrée dans la dernière version est annulée, y compris les corrections de bugs pour d'autres problèmes et les petites améliorations qui fonctionnaient correctement. Un rollback prend également du temps : le pipeline doit s'exécuter, les images conteneur doivent être reconstruites et poussées, les serveurs doivent redémarrer. Un kill switch, en revanche, désactive une seule fonctionnalité. Tout le reste de l'application continue de fonctionner sur la dernière version.

Le diagramme ci-dessous montre à quelle vitesse un kill switch arrête l'impact utilisateur par rapport à un rollback complet.

Voici un exemple minimal de la façon dont un flag de kill switch encapsule une fonctionnalité en JavaScript :

const featureFlags = {
  isEnabled(flagName) {
    // En production, cela lit depuis un service de configuration distant
    return config[flagName] === true;
  }
};

function handleCheckout(userCart) {
  if (featureFlags.isEnabled('new-checkout')) {
    // Nouveau flux de paiement avec des bugs potentiels
    return newCheckoutFlow(userCart);
  } else {
    // Ancien flux de paiement stable
    return oldCheckoutFlow(userCart);
  }
}

Lorsque le flag bascule à false, l'application revient instantanément à l'ancien chemin de code sans aucun redéploiement.

flowchart TD subgraph Kill_Switch_Path A1[Fonctionnalité défaillante] --> B1[Bascule du flag] --> C1[Ancien code exécuté immédiatement] --> D1[Utilisateurs non impactés] end subgraph Rollback_Path A2[Fonctionnalité défaillante] --> B2[Reconstruction du pipeline] --> C2[Redéploiement] --> D2[Redémarrage des serveurs] --> E2[Utilisateurs impactés pendant plusieurs minutes] end A1 -->|Temps gagné| D1 A2 -->|Temps perdu| E2

Quand les Kill Switches sont-ils les plus efficaces ?

Les kill switches sont particulièrement utiles pour les fonctionnalités récemment déployées qui n'ont pas encore prouvé leur stabilité. Pensez à un nouveau flux de paiement qui s'avère avoir un bug de calcul des frais de livraison. Avec un kill switch en place, vous pouvez désactiver immédiatement cette nouvelle fonctionnalité de paiement. Les utilisateurs retournent à l'ancienne page de paiement. Votre équipe peut alors corriger le bug sans précipitation, car les utilisateurs ne sont plus affectés par le problème.

Ce modèle fonctionne bien pour :

  • Les nouveaux composants d'interface utilisateur qui pourraient casser sous le trafic utilisateur réel
  • Les fonctionnalités expérimentales qui modifient la logique métier principale
  • Les intégrations tierces qui se comportent différemment en production qu'en staging
  • Les modifications à haut risque que vous souhaitez valider d'abord avec un petit public

L'essentiel est que le kill switch isole proprement le chemin de code problématique. Lorsque le flag est désactivé, l'application doit se comporter exactement comme avant l'introduction de la nouvelle fonctionnalité.

Où les Kill Switches montrent leurs limites

Les kill switches ne sont pas une solution universelle. Si le problème ne vient pas de la nouvelle fonctionnalité elle-même mais de modifications d'infrastructure ou de migrations de base de données, basculer un flag ne servira à rien. Par exemple, si une nouvelle requête de base de données surcharge votre base de production, désactiver le feature flag pourrait ne pas suffire car la requête a déjà été exécutée. Les dégâts sont faits. Dans ce genre de cas, vous avez besoin d'un rollback ou d'une correction directe de l'infrastructure.

Les kill switches nécessitent également une conception soignée dans le code. Le flag qui sert de kill switch doit séparer proprement le nouveau code de l'ancien code. Si la nouvelle fonctionnalité a déjà modifié des données dans la base, désactiver le flag ne restaure pas automatiquement ces données à leur état précédent. Votre équipe doit réfléchir à ces effets de bord avant de décider de s'appuyer sur un kill switch.

Considérez une fonctionnalité qui écrit dans une nouvelle table de base de données. Lorsque vous basculez le kill switch, l'application arrête d'écrire dans cette table, mais les données déjà écrites restent là. Si l'ancien chemin de code ne lit pas dans cette table, les données obsolètes pourraient ne pas causer de problèmes immédiats. Mais si l'ancien chemin de code attend des données dans un format ou un emplacement différent, vous pourriez vous retrouver avec des incohérences difficiles à démêler plus tard.

Combiner Kill Switches et Circuit Breakers

Certaines équipes associent les kill switches aux circuit breakers. Un circuit breaker désactive automatiquement une fonctionnalité lorsque le taux d'erreur dépasse un seuil défini. Par exemple, si le taux d'erreur dépasse cinq pour cent en une minute, le circuit breaker désactive la fonctionnalité sans intervention humaine.

Cette combinaison est particulièrement utile pour les fonctionnalités qui s'exécutent en dehors des heures de travail ou lorsque votre équipe n'est pas d'astreinte. Le circuit breaker agit comme un filet de sécurité automatisé, tandis que le kill switch vous offre une intervention manuelle lorsque vous devez agir plus vite que le système automatisé ne peut réagir.

Le modèle du circuit breaker ajoute une couche supplémentaire : il peut également détecter quand le problème sous-jacent a été résolu et réintroduire progressivement le trafic vers la fonctionnalité. Cela le rend plus sophistiqué qu'un simple kill switch, mais aussi plus complexe à implémenter et à tester.

Que se passe-t-il après le déclenchement du Kill Switch ?

Basculer un kill switch est une réponse d'urgence, pas une solution permanente. Une fois la fonctionnalité désactivée, votre équipe doit trouver la cause racine. La fonctionnalité qui a été désactivée n'est pas abandonnée. Vous corrigez le bug, testez la correction, puis réactivez le flag.

Si vous ne suivez pas ce processus, le flag restera dans votre codebase indéfiniment. Les flags morts deviennent une dette technique. Ils encombrent le code, confondent les futurs développeurs et augmentent le risque que quelqu'un active accidentellement une fonctionnalité défaillante des mois plus tard.

Checklist pratique pour les Kill Switches

Avant de vous fier à un kill switch en production, parcourez cette checklist :

  • Le flag peut-il séparer proprement le nouveau code de l'ancien code sans effets de bord ?
  • La désactivation de la fonctionnalité laisse-t-elle les données dans un état cohérent ?
  • Le basculement du flag est-il accessible à l'équipe d'astreinte sans nécessiter un déploiement ?
  • Avez-vous testé le comportement du kill switch dans un environnement de staging ?
  • L'équipe sait-elle qui a l'autorité de basculer le kill switch ?
  • Existe-t-il un processus documenté pour ce qui se passe après le déclenchement du kill switch ?

L'essentiel à retenir

Un kill switch vous donne la capacité de désactiver une seule fonctionnalité en quelques secondes sans rollback de l'ensemble de votre application. Ce n'est pas un remplacement des rollbacks ou des tests appropriés, mais c'est un mécanisme de sécurité critique pour toute équipe qui livre des fonctionnalités de manière incrémentale. Concevez vos feature flags pour qu'ils puissent servir de kill switches. Testez qu'ils fonctionnent réellement. Et lorsque vous en basculez un, traitez-le comme le début d'un cycle de correction, pas comme la fin de la conversation.