Feature Flipping en Scala

Feature Flipping en Scala

Dans le cadre du décommissionnement de systèmes legacy vers des systèmes plus modernes, avec une deadline très courte, nous avons rencontré le problème suivant :

Comment faire cohabiter les deux systèmes afin de pouvoir migrer progressivement en limitant au maximum les cas non gérés en un temps record ?

Méthode

Dans le cadre de la migration d’un de nos projets critiques 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.

Si le projet est critique et massivement fréquenté, il est préférable d’utiliser la nouvelle base de données en lecture de manière progressive, tout en écrivant dans les deux bases de données.

De même, il est nécessaire de pouvoir switcher rapidement vers l’ancienne base de données en cas de problème sur la plateforme.

Implémentation

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.

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.

Finalement, nous allons encapsuler tout cela dans une classe afin d’obtenir tous les éléments nécessaires.

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 :

recette et pré-productionproduction
EcritureCloud ET MongoDBCloud ET MongoDB
LectureCloudMongoDB
UXRésolution de bugs et testsAucun changement pour l’utilisateur

A noter que cet utilitaire peut également être utilisé pour de l’A/B testing en passant en paramètre le résultat de votre règle d’A/B testing.

Vous pouvez retrouver le code ici.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *