Microservices: MonolithFirst?

9

J'ai fait des recherches sur les architectures de microservices en essayant d'obtenir un aperçu de haut niveau de tous les avantages et inconvénients, pourquoi et pourquoi, etc. Une grande partie des informations que je lis / regarde proviennent de ThoughtWorks (Martin Fowler, Neal Ford, et Al).

La plupart des travaux de Martin Fowler sur le sujet datent de quelques années, lorsque Microservices (en tant que nom connu dans la programmation, sinon en médecine générale) était encore jeune, j'en prends donc une grande partie avec un grain de sel.

Une chose en particulier est la suivante:

En entendant des histoires sur des équipes utilisant une architecture de microservices, j'ai remarqué un schéma commun.

  • Presque toutes les histoires de microservices réussies ont commencé avec un monolithe qui est devenu trop grand et a été brisé
  • Presque tous les cas où j'ai entendu parler d'un système qui a été conçu comme un système de microservice à partir de zéro, il s'est retrouvé dans de graves problèmes.

Ce modèle a conduit plusieurs de mes collègues à affirmer que vous ne devriez pas démarrer un nouveau projet avec des microservices, même si vous êtes sûr que votre application sera suffisamment volumineuse pour en valoir la peine. .

(ref: https://martinfowler.com/bliki/MonolithFirst.html - mettez l'accent sur le leur)

Maintenant, 3 ans plus tard et avec les microservices un terme plus omniprésent, est-il généralement acceptable qu'un nouveau système soit généralement mieux servi en ayant des blocs de service plus grands (-qui-microservice-mais-plus petits que-monolithiques) pour commencer, et en faisant les rendre plus granulaires dans le cadre d'une mesure évolutive?

Ou, existe-t-il une norme pour commencer un projet à partir de zéro avec une architecture de microservices granulaire, contrairement aux déclarations ci-dessus?

On dirait une approche générale saine, mais curieuse des pensées de la communauté.

jleach
la source

Réponses:

2

Si votre entreprise fait des microservices depuis un certain temps, certaines pièces peuvent déjà être construites et vous devez simplement les intégrer. Des exemples probables peuvent être l'authentification en tant que service ou le stockage de données d'objets blob. Dans ce cas, vous avez déjà défini les limites et vous réutilisez le code dans une nouvelle application. C'est une bonne chose.

Pour un nouveau code où vous n'êtes pas sûr de l'endroit où doit se trouver la limite, créez-le en un seul service. Si vous le gardez modulaire, vous pouvez en séparer les microservices si nécessaire. D'autant plus que vous trouvez des éléments de votre service qui doivent évoluer différemment des autres.

L'avantage des microservices est que vous pouvez ajouter des instances pour adapter le travail effectué à la demande. Si une partie de votre travail se décompose, il peut être judicieux de le séparer dans son propre microservice.

En général:

  • Si vous avez déjà construit des microservices, réutilisez-les
  • Si vous construisez quelque chose de nouveau, faites d'abord fonctionner l'idée
  • Pendant que vous construisez, essayez de garder les choses modulaires afin que certains services puissent facilement être déployés
  • Au fur et à mesure que vous construisez, si une partie de votre service doit pouvoir évoluer à la demande à un taux différent, séparez-le en son propre service

Trop souvent, nous entendons des directives utiles de personnes intelligentes ayant une bonne réputation comme Martin Fowler, puis nous en faisons une doctrine difficile qui ne peut en aucun cas être influencée.

Vous devez prendre des déclarations comme ça dans l'esprit de leur signification. Martin Fowler essaie de sauver les gens de la paralysie par l'analyse et leur dit de construire quelque chose qui fonctionne en premier. Vous pouvez toujours le séparer plus tard, lorsque vous en saurez plus sur le fonctionnement réel de votre application.

Berin Loritsch
la source
13

Les avantages les plus immédiats des microservices peuvent être obtenus par une simple modularisation du code. Vous pouvez isoler des groupes de fonctionnalités en modules en utilisant le système de modules que vous possédez (maven, npm, nuget, peu importe). Chaque module peut servir un seul objectif, s'asseoir sur son propre référentiel, utiliser son propre schéma de base de données, gérer sa propre configuration, avoir son propre backlog de fonctionnalités et calendrier de publication. Ils peuvent toujours être déployés ensemble sur un monolithe. C'est une quantité très gérable de frais généraux et donne de bons avantages. Le plus gros frais généraux provient de la séparation des déploiements, ce qui n'est vraiment utile qu'une fois que vous avez suffisamment d'évolutivité pour le rendre nécessaire. Si votre code est déjà modulaire, la migration sera plus facile le moment venu.

jiggy
la source
Cela ressemble à une bonne pratique de codage général, combinée à une légère amélioration de la gestion de la base de code, mais ne correspond pas au chemin "ne pas avoir à mettre à jour le monolithe entier sur une mise à jour de service mineure", qui est l'endroit où je m'attends à ce que les microservices aient tendance briller. En tout cas, bon conseil, merci.
jleach
1
Entièrement d'accord avec la réponse. Un monolithe bien construit et correctement modulaire offre la plupart (mais pas tous) des avantages des microservices. D'un autre côté, les microservices ont leurs propres problèmes assez importants.
Milos Mrdovic
@jleach Une bonne qualité de modularisation est la déployabilité indépendante. Si vous devez recompiler et redéployer votre monolithe entier afin de faire une mise à jour mineure du module, vous faites quelque chose de mal.
Milos Mrdovic
2
C'est une bonne approche. Ne construisez pas un microservice pour faire du microservice. L'architecture de microservice doit être utilisée pour résoudre les problèmes, mais ils sont également livrés avec un ensemble de ses propres problèmes, donc si vous n'êtes pas prêt / conscient de ces compromis, vous devez faire très attention à développer le microservice à partir de zéro.
Lie Ryan
1
@MilosMrdovic, même avec l'approche module, vous pouvez toujours gagner en efficacité dans le déploiement car vous n'avez pas besoin de retester l'intégralité de votre monolithe, uniquement le module que vous mettez à jour. Si votre module passe toutes les portes de qualité, vous pouvez le construire et l'expédier. Ensuite, votre monolith a juste besoin de mettre à jour sa version de dépendance et de redéployer. Vous n'aurez pas besoin de reconstruire d'autres modules.
jiggy
2

À mon avis, il peut être avantageux de développer d'abord un monolithe (ou mieux: de développer des parties de votre application en tant que monolithe).

Il y a des cas où vous n'êtes pas sûr du domaine et des limites de votre problème (par exemple, je construis un site de gestion de navire, ai-je besoin d'un service de navire ET d'un service de flotte, ou un service de navire est-il suffisant?), Et dans de tels cas, un le monolithe peut être plus facile à développer.

Vous devez arrêter de faire cela si vous devez intégrer différentes technologies dans le mélange (par exemple, vos pièces existantes sont écrites en C #, mais votre nouveau problème nécessite un apprentissage automatique, il est préférable de le faire avec python), avez une bonne compréhension des domaines dans votre projet ou votre monolith traite pour galvaniser, par exemple tout le monde construit ce monolithe et écrase la notion de services séparés.

Christian Sauer
la source
1
«Et dans de tels cas, un microservice peut être plus facile à développer» - vouliez-vous parler de monolithes là-bas?
amon
@amon Merci, j'ai corrigé la phrase - mon fils m'a interrompu 34235 fois donc j'étais confus;)
Christian Sauer
Bien que je sois d'accord avec votre première phrase, je pense que vous devriez considérer que même votre monolithe devrait déjà être "modulaire" à l'intérieur, sinon vous ne pourrez tout simplement pas séparer quoi que ce soit sans que tout tombe.
Walfrat
@Walfrat J'ai tendance à être d'accord, mais la tentation de réutiliser le code existant est beaucoup plus grande (et moins facilement écrasée) dans un monolithe. Par exemple "oh regardez, quelqu'un a défini un WidgetId, je vais juste le réutiliser pour mon FormId": De plus, vous ne pouvez pas facilement utiliser une autre langue / db pour un projet, ce qui favorise vraiment la pensée "tout le monde doit utiliser des outils communs"
Christian Sauer
1

Je suis presque sûr qu'il y a eu quelques questions sur cet article exact de MF.

Mon point de vue est le suivant:

Un Monolith avec des problèmes de maintenance ou d'évolutivité est amélioré en le décomposant en micro services. Un tel projet sera presque toujours «réussi» car même la décomposition d'une petite section peut entraîner des gains mesurables et vous pouvez tracer une ligne en dessous lorsque vous êtes satisfait.

Que ce soit votre moitié monolithe + une file d' attente de messages et un couple de processus de travail compte comme « Microservice architecture » est un argument d'avoir au pub, mais vous serez certainement appelez ce que lorsque vous parlez du projet.

D'un autre côté, tout nouveau projet, quelle que soit l'architecture choisie, risque de ne pas répondre aux attentes, vous vous attendez donc naturellement à un taux de réussite inférieur. De plus, si vous avez commencé à chercher à faire de l'ensemble une «architecture de microservices de meilleures pratiques», vous vous aventurez peut-être dans les nouvelles technologies et les éléments les plus difficiles des microservices.

Nous devons également nous rappeler que MF écrit dans une grande perspective POO. Il est naturellement sceptique quant à une approche distribuée plus moderne.

De nos jours, je m'attendrais à ce que toute solution de grande entreprise intègre un élément de microservices et seul un imbécile vous recommanderait de créer une application monolithique géante à moins que vous ne distribuiez une seule application de style bureau.

Ewan
la source
Merci. Si la MF a tendance à être légèrement biaisée, y a-t-il quelqu'un dont je peux étudier le travail de l'autre côté pour gagner en profondeur?
jleach
Je ne recommanderais pas les «célébrités du Web» comme ressource d'apprentissage. C'est correct pour quelques anecdotes et une conversation amusante, mais d'après mon expérience, c'est le détail qui fait toute la différence entre le succès et l'échec.
Ewan
0

Dans ma (vaste) expérience, j'ai vu beaucoup plus de projets échouer à cause de problèmes humains que de problèmes technologiques. Malheureusement, les gens n'aiment pas échouer et ont donc tendance à dénaturer les raisons de l'échec et à blâmer la technologie.

Dans mon domaine, la finance, la plupart des nouveaux projets suivent de nos jours des architectures de microservices, et il semble que ce soit une architecture gagnante du point de vue du coût total de possession (TCO). Ces projets ne semblent pas échouer aussi souvent, et lorsqu'ils le font, les raisons invoquées ne répertorient pas souvent l'architecture de l'application comme problème.

Ingénieur logiciel
la source
Les microservices résolvent en fait de nombreux problèmes d'organisation. Si chaque service a un propriétaire, vous savez comment vous étouffer lorsque quelque chose ne fonctionne pas.
Jiggy
@jiggy: si le code est bien modulaire, vous n'avez pas nécessairement besoin de le diviser en plusieurs services pour savoir qui étouffer.
Lie Ryan
@Ryan, si quelqu'un pense que microservices et modularisation sont synonymes, il a complètement raté le point.
Ingénieur logiciel