web-dev-qa-db-fra.com

Mise à l'échelle des monolithes et mise à l'échelle des microservices

L'un des arguments les plus courants pour utiliser les microservices est une meilleure évolutivité. Mais je me demande si cet argument est vraiment valable.

Disons que nous avions une application composée de 10 microservices dont 9 ont chacun deux instances (pour la redondance) et l'une d'entre elles avec 4 instances pour gérer la charge (évolutivité). L'argument pro-microservice est alors que vous pouvez faire évoluer ce miroservice indépendamment des autres services.

Cependant, disons que les 10 microservices étaient des modules dans un seul monolithe et que plusieurs instances (par exemple 22 comme la somme ci-dessus) de ce monolithe ont été déployées. Le système doit être capable de gérer la charge pour la seule pièce critique, car il y a suffisamment d'instances pour le faire. Si les instances contiennent une logique de programme non nécessaire, le seul inconvénient serait que le binaire et la quantité de RAM seraient légèrement plus grands. Mais là encore, la différence ne devrait pas être trop grande dans la plupart des cas - du moins pas par rapport au reste de la pile (pensez à Spring Boot) .L'intérêt d'un monlith à l'échelle serait un système plus simple sans (la plupart) les erreurs d'un système distribué.

Suis-je en train de manquer quelque chose?

15
deamon

Le but des microservices n'est pas de réduire la charge du processeur. En fait, en raison de la surcharge de communication et de la répétition de fonctions qui étaient autrefois du code utilitaire global, il augmente charge du processeur en général.

Le but de l'abolition d'un monolithe est bien plus de pouvoir maintenir, déployer et exécuter un système complexe de fonctionnalités pas du tout. Une fois que votre système atteint une certaine taille, la compilation, les tests, le déploiement, etc., un monolithe devient tout simplement trop cher pour être réalisable tout en maintenant une disponibilité décente. Avec les microservices, vous pouvez mettre à niveau, redémarrer ou restaurer un système au coup par coup.

Ne vous y trompez pas, nous n'écrivons pas de microservices car c'est intrinsèquement une meilleure solution pour coupler les choses de manière lâche sur des interfaces distantes. En fait, la perte de type fort et de cohérence vérifiant qu'un monolithe pourrait fournir est souvent un inconvénient majeur. Nous le faisons parce que nous devons parce que la complexité a pris le dessus sur nous et tire le meilleur parti d'une situation sous-optimale.

21
Kilian Foth

Vous avez surtout raison. Si vous avez des services rapides qui sont chargés également, vous pouvez tout aussi bien les installer sur toutes les boîtes. Ce n'est pas aussi "agréable" que d'avoir une boîte par service, mais cela permet d'économiser de l'argent.

Toutefois. dès que vous avez un déséquilibre, disons que le service 5 prend 100% du processeur pendant 2 min, vous voulez déplacer ce service dans sa propre boîte afin qu'il ne bloque pas tous les autres services s'il s'exécute.

Si les appels au service 5 expirent en raison de la charge, seules certaines fonctions de votre application échoueront au lieu de toutes.

Maintenant, vous pouvez faire la même chose avec un monolithe bien modularisé. Installez tous les services, mais acheminez uniquement le trafic du service 5 vers l'un d'eux. Sans acheminer le trafic du service 5 vers les autres boîtes.

Mais généralement, les monolithes, de par leur nature même, ne sont pas une collection lâche de services qui se trouvent être installés sur la même boîte. Il y aura des appels en mémoire entre les modules qui entraîneront l'échec de l'application.

3
Ewan

Les micro-services ont pour but 1) la séparation des préoccupations et 2) la répartition de la charge. Essentiellement, cela nous libère pour offrir le meilleur service de boîte noire possible avec des technologies spécifiques à cette tâche. Nos services peuvent être polyglottes - c'est-à-dire écrits dans différents langages de programmation sur différentes piles. Différentes équipes peuvent travailler sur chaque service sans savoir comment les autres fonctionnent au-delà du contrat de leur API. Ceci, pris dans son ensemble, permet une base de code beaucoup plus simple pour chaque service qui est plus facile à déboguer, à comprendre et à modifier pour les performances.

1
Lewis A Sellers