J'ai un problème. Utilisons Microservices! Maintenant, j'ai 13 problèmes distribués.
Diviser votre système en composants encapsulés, cohésifs et découplés est une bonne idée. Cela vous permet d'aborder différents problèmes séparément. Mais vous pouvez parfaitement le faire dans un déploiement monolithique (voir Fowler: Microservice Premium ). Après tout, c'est ce que OOP enseigne depuis plusieurs décennies! Si vous décidez de transformer vos composants en microservices, vous ne gagnez aucun avantage architectural. Vous gagnez en flexibilité en matière de choix technologique et éventuellement (mais pas nécessairement!) En matière d'évolutivité. Mais vous avez la garantie de souffrir de maux de tête provenant (a) de la nature distribuée du système et (b) de la communication entre les composants. Le choix de microservices signifie que vous avez d’autres problèmes tellement pressants que vous êtes prêt à utiliser des microservices malgré ces problèmes.
Si vous ne pouvez pas concevoir un monolithe proprement divisé en composants, vous ne pourrez pas non plus concevoir de système de microservice. Dans une base de code monolithique, la douleur sera assez évidente. Idéalement, le code ne sera tout simplement pas compilé s'il est horriblement cassé. Mais avec les microservices, chaque service peut être développé séparément, éventuellement dans différentes langues. Les problèmes d'interaction entre les composants ne deviendront apparents que lorsque vous aurez intégré vos composants. À ce stade, il est déjà trop tard pour réparer l'architecture globale.
La source n ° 1 de bogues est une incompatibilité d'interface. Il peut y avoir des erreurs flagrantes telles qu'un paramètre manquant ou des exemples plus subtils tels que l'oubli de la vérification d'un code d'erreur ou de la vérification d'une condition préalable avant d'appeler une méthode. Le typage statique détecte ces problèmes le plus tôt possible: dans votre IDE et dans le compilateur, avant que le code ne soit exécuté. Les systèmes dynamiques n'ont pas ce luxe. Il ne va pas exploser avant que ce code défectueux soit exécuté.
Les implications pour les microservices sont terrifiantes. Les microservices sont intrinsèquement dynamiques. Sauf si vous passez à un langage de description de service formel, vous ne pouvez vérifier aucun type de correction de l'utilisation de votre interface. vous devez tester, tester, tester! Mais les tests sont coûteux et ne sont généralement pas exhaustifs, ce qui laisse la possibilité que des problèmes persistent dans la production. Quand ce problème deviendra-t-il apparent? Uniquement lorsque ce chemin défectueux est pris, au moment de l'exécution, en production. L'idée que les problèmes de produiraient des retours plus rapides esthilarant dangereusement faux, à moins que la possibilité d’une perte de données ne vous amuse.