REX | Feature Flipping en Scala
Contenu
Contenu
Le pattern « feature flipping » permet d’activer et désactiver des fonctionnalités directement en production, sans re-livraison de code.
Contexte
Dans le cadre de la migration d’un projets de MongoDB vers un PostgreSQL sur Google Cloud Platform avec une deadline courte, j’ai implémenté une fonction permettant d’abstraire le concept de Feature Flipping.
Le site web est massivement fréquenté, il est donc préférable d’effectuer le passage vers le système cible de manière progressive (en écrivant dans les deux bases de données).
En effet, il est nécessaire de pouvoir switcher rapidement vers l’ancien système en cas de problème sur la plateforme.
Question
Implémentation
Type Générique
Pour cela, j’ai d’abord utilisé un type générique qui représente une fonction prenant une unique entrée :
|
|
Ce type va nous permettre de définir d’une manière abstraite nos deux fonctions A et B.
Nous aurons ainsi une fonction « newFeatureFunction » et une fonction « oldFeatureFunction » ayant les même paramètres et la même sortie.
|
|
Fonction Générique
Finalement, il nous reste à appliquer l’algorithme que nous souhaitons utiliser, notamment dans le cas où la nouvelle fonction échoue.
Dans notre cas, nous souhaitons que si la nouvelle feature échoue, l’ancienne feature prenne le relais afin d’éviter toute interruption de service pour les utilisateurs.
|
|
Ici, la fonction « handleFeatureFlipping » prend en paramètre :
- un booléen indiquant s’il faut appliquer la nouvelle feature
- un unique input du type de notre choix
- la fonction de la nouvelle feature
- la fonction de l’ancienne feature
Cette fonction nous permet également de centraliser dans le code notre algorithme, ce qui améliore la maintenabilité de notre code.
Résultat
Finalement, nous allons encapsuler tout cela dans une classe afin d’obtenir tous les éléments nécessaires.
|
|
Exemple
Voici un exemple d’implémentation :
|
|
Conclusion
Cet utilitaire qui permet le passage progressif d’un système ancien vers un système plus récent (cloud par exemple) s’est révélé très utile.
Nous sommes maintenant capables de tester et repérer les bugs liés à la migration sur nos différents environnements en faisant cohabiter les systèmes :
staging | production | |
---|---|---|
Ecriture | Cloud ET MongoDB | Cloud ET MongoDB |
Lecture | Cloud | MongoDB OU Cloud |
UX | Résolution de bugs et tests | Aucun changement pour l’utilisateur |
Astuce
|
|
Vous pouvez retrouver le code ici .