avons-nous bouclé la boucle avec les microservices, de retour à des approches très old school?

9

En termes d’architecture et de conception logicielles, comment les microservices s’empilent-ils (jeu de mots) contre le middleware? Je viens de Java, et il semble que lorsque vous vous éloignez du REST direct en tant qu'API, et que vous supprimez différentes couches et paramètres de connexion, au moins en Java, vous avez presque bouclé la boucle avec des idées très anciennes. . Nous sommes revenus à la virtualisation ... alors que la JVM est déjà virtuelle.

De manière agnostique, vous pouvez, et je dirais les avantages de l'abstraction d'une API RESTful à CORBA. Ou, d'une manière plus centrée sur java, JMS ou MDB.

À une époque, EJB était un gros problème à Java, puis il a été reconnu comme un peu d'effet de cluster, mais, maintenant, revenons-nous au début?

Ou, les microservices offrent-ils quelque chose qui manque à CORBA, ou mieux encore, MDB? Quand je lis (TLDR) Martin Fowler expliquant les microservices, cela me semble être une bonne solution à un mauvais problème, si vous voulez. Ou plutôt, une approche fermée qui introduit un niveau de complexité qui ne fait que pousser le problème. Si les services sont vraiment micro et nombreux, alors chacun a un coût en dollars pour le faire fonctionner et le maintenir.

De plus, si un micro- service parmi de nombreux autres change son API, tout dépend de ce service. Il ne semble pas faiblement couplé, il semble l'opposé de l'agile. Ou est-ce que j'utilise mal ces mots?

Bien sûr, il y a une quantité indéterminée de choix entre ces extrêmes.

Requin contre Gorille ... allez-y! (Pour le pédant, c'est censé être ironique, et ce n'est pas du tout mon intention. La question est censée être prise au pied de la lettre. Si la question peut être améliorée, veuillez le faire, ou commenter et je corrigerai. )

Imaginez une multitude de microservices fonctionnant en docker, le tout sur une même machine, parlant entre eux ... folie. Difficile à maintenir ou à administrer, et presque impossible de changer quoi que ce soit car tout changement se répercutera en cascade et provoquera des erreurs imprévisibles. Comment est-il préférable que ces services soient répartis sur différentes machines? Et, s'ils sont distribués, alors certaines techniques très, très anciennes ont résolu, au moins dans une certaine mesure, l'informatique distribuée.

Pourquoi la mise à l'échelle horizontale est-elle si répandue ou du moins souhaitable?

Thufir
la source
4
Voter pour clore. On ne sait pas exactement ce que vous demandez et pourquoi vous le demandez. L'architecture de microservice n'est qu'une autre architecture. Ni plus ni moins.
davidk01
1
Vous pourriez également trouver cet article utile: devweek.com/blog/microservices-the-good-the-bad-and-the-ugly
davidk01
1
Je préfère "Alors maintenant, ils ont des centaines de petits faux services, et au lieu d'un monolithe, ils doivent se soucier de ce qui se passe quand quelqu'un veut changer le contrat de l'un de ces services. Une pelote de laine, sous un nom différent. Au lieu de cela de se demander si le code compilera s’ils apportent une modification, ils se demandent s’il s’exécutera, en pratique. " - les microservices pour les grincheux cervidés renoncent: non, je ne suis pas un cervelet, c'est juste un article humoristique.
Thufir
"Au lieu de se demander si le code va se compiler ... ils se demandent s'il va s'exécuter ..." En fait, ce n'est pas du tout un problème. Tout simplement parce que si un développeur modifie un contrat sans en informer toutes les parties impliquées - ce développeur doit être fessé très fort. Au sens propre. Si nous utilisons un contrat à terme, imaginez si votre fournisseur de téléphonie mobile modifie les termes du contrat sans vous demander / vous informer? C'est pourquoi il s'agit d'un contrat - toutes les parties impliquées doivent être conscientes / s'accorder sur les changements de contrat et quand ce changement se produit (en supposant un flux de développement approprié), tous doivent être testés et fonctionner correctement.
Alexey Kamenskiy
1
@Thufir Comme cela a été dit avant que la SEP ne soit qu'une autre approche, elle aura ses avantages et ses inconvénients. En fait, j'ai travaillé avec cette approche (avant même que j'entende dire qu'elle porte un nom spécial) sur plusieurs projets. En remarque - ce n'est pas une cascade, c'est ce que vous en faites. Comme j'ai travaillé pour un projet développant (en équipe) une partie du système d'exploitation mobile, cette approche est le seul moyen car le système d'exploitation ne peut pas être créé giant blob, il doit avoir des interfaces, donc chaque partie à partir du noyau est une sorte de MS, et la première chose avant toute équipe a commencé à écrire du code devait se mettre d'accord sur les spécifications v0.0.1.
Alexey Kamenskiy

Réponses:

2

TL; DR. J'ai eu le plaisir de boire beaucoup de Kool-Aid aromatisé Microserver, donc je peux parler un peu des raisons derrière eux.

Avantages:

  • Les services savent que leurs dépendances sont stables et ont eu le temps de cuire
  • Autoriser les déploiements continus de nouvelles versions
  • Permet aux composants d'être inversés sans affecter les couches supérieures.

Les inconvénients:

  • Vous ne pouvez pas utiliser les fonctionnalités nouvelles et brillantes de vos dépendances.
  • Vous ne pouvez jamais rompre la compatibilité descendante de l'API (ou du moins pas pour de nombreux cycles de développement).

Je pense que vous comprenez fondamentalement comment une architecture de microservices est censée fonctionner. La façon dont il est censé être exécuté est que chaque microservice (appelé à partir de maintenant dans MS) a une API rigide sur laquelle tous ses clients sont d'accord. Le MS est autorisé à apporter les modifications qu'il souhaite tant que l'API est préservée. Le MS peut être jeté et réécrit à partir de zéro, tant que l'API est préservée.

Pour faciliter le couplage lâche, chaque MS dépend de la version n-1 de ses dépendances. Cela permet à la version actuelle du service d'être moins stable et un peu plus risquée. Il permet également aux versions de sortir par vagues. Le premier serveur est mis à niveau, puis la moitié et enfin le reste. Si la version actuelle développe des problèmes graves, le MS peut être restauré à une version précédente sans perte de fonctionnalité dans d'autres couches.

Si l'API doit être modifiée, elle doit être modifiée d'une manière qui est rétrocompatible.

Konstantin Tarashchanskiy
la source
"Le MS peut être jeté et réécrit à partir de zéro, tant que l'API est préservée." - rien de nouveau là-bas, mais ok. En termes de performances, à l'autre extrémité du spectre, comment tous ces États membres se comparent-ils à une application / un service / un système monolithique? En termes de distribution, il semble , et corrigez-moi s'il vous plaît, qu'il y a un gain de performance potentiel en mettant n MS sur une seule machine ... virtualisé sur un ordinateur central ?? C'est presque comme plus vous redimensionnez les MS horizontalement, plus il devient simple de les redimensionner ensuite verticalement ...? Points bonus pour ne pas avoir lu ma question :)
Thufir
1
Comme pour toute couche d'indirection, vous prenez un coup de performance par rapport à une grosse boule de boue. Dans le cas de la SEP, cela est particulièrement coûteux car vous effectuez un aller-retour réseau à chaque appel. L'utilisation de la virtualisation ou de conteneurs raccourcit considérablement le trajet, car l'appel ne quitte jamais la machine. Cela signifie également que vous obtenez plus d'isolement (un service incontrôlable ne peut pas nuire à ses pairs) avec un coût matériel plus faible.
Konstantin Tarashchanskiy
5

Chaque technique de développement logiciel que nous ayons jamais inventée concerne la gestion de la complexité d'une manière ou d'une autre. Une grande partie d'entre eux concernait et continue de concerner l'abstraction, l'encapsulation et le couplage lâche. Les microservices sont encore une autre façon de faire ces choses, c'est probablement pourquoi cela ressemble à beaucoup de techniques plus anciennes à un niveau théorique élevé, mais cela ne le rend pas moins utile ou pertinent.

En ce qui concerne le couplage lâche, je pense que vous avez un peu mal compris l'objectif. Si la tâche A doit appeler la tâche B, il n'y aura jamais moyen de découpler A et B à 100%. Ça n'arrivera jamais. Ce que vous pouvez faire est de vous assurer que, si la tâche B appelle la tâche C, alors la tâche C ne devrait jamais avoir à se soucier des modifications apportées à A. Si ces trois tâches sont toutes liées ensemble dans un gros blob, en se transmettant des structures, alors il y a un une chance importante qu'ils devront tous changer si l'un d'eux le fait. Mais si les trois sont des microservices, alors vous êtes essentiellement assuré qu'un changement vers A ne forcera que B à mettre à jour (à moins que ce soit un changement si énorme dans la fonctionnalité de base de A que vous auriez probablement dû en faire un tout nouveau service). Cela est particulièrement vrai si toutes les mises à jour de microservices sont effectuées d'une manière rétrocompatible, ce qu'elles devraient être.

En ce qui concerne le commentaire agile, je peux vous dire par expérience personnelle que notre code de microservice-y joue beaucoup mieux avec agile que notre code "lié dans un gros blob". Dans ce dernier, chaque fois que quelqu'un corrige un bogue dans une fonction de bas niveau, il doit littéralement envoyer à tout le département R&D un e-mail disant "veuillez relier vos tâches ou elles planteront toutes vendredi". Nous en recevons deux chaque semaine . Si son code était dans un microservice, nous bénéficierions tous automatiquement du correctif dès qu'il déploierait une nouvelle version.

Je ne comprends pas complètement le commentaire sur COBRA et MDB, car ils ne semblent pas être des architectures logicielles mais plutôt des composants d'une seule; à ma connaissance, ce sont des moyens potentiels de définir les protocoles de messagerie de vos microservices et / ou de mettre en œuvre lesdits microservices, et non en soi des alternatives aux microservices.

Ixrec
la source
1
"Si ces trois tâches sont toutes reliées entre elles dans un seul gros blob ..." Je n'ai qu'une perspective Java à ce sujet, mais je dirais "non", mauvaise idée, ne faites pas ça. Créez une bibliothèque, API # 1, API # 2, etc., pour accomplir votre point exact de "..tâche C ne devrait jamais avoir à se soucier des modifications apportées à A", car C est un client de B uniquement et pas de A du tout . À cet égard, je ne considère pas cela comme nouveau, pardon. Je sais que la question que j'ai posée était floue. C'est une question floue parce que je suis floue sur ce dont il s'agit. Chaque réponse m'a été utile, ne serait-ce que pour m'aider avec mon vocabulaire.
Thufir
1
@Thufir Si les bibliothèques sont toutes liées dynamiquement et que les tâches s'exécutent toutes sur exactement le même ensemble de machines, alors vous avez raison, cela permettrait en effet un déploiement séparé. Mais les microservices vous permettent de supprimer même ces hypothèses, si vous voulez aller aussi loin avec le découplage. Il est tout à fait raisonnable de ne pas le faire.
Ixrec
CORBA est (était) une technologie distribuée qui permettait des architectures distribuées à une époque (fin 1990) où il n'y avait pas encore de noms répandus pour les définir. Vous étiez libre d'implémenter des systèmes à base de CORBA à grain grossier ou à grain fin aboutissant à ce que l'on appellera plus tard SOA ou Microservices. CORBA n'a pas survécu, mais nous le faisons à nouveau, juste avec une technologie différente. Le problème, cependant, n'était pas la technologie. Alors oui, nous bouclons la boucle. J'espère que nous avons appris quelque chose au cours du processus.
xtian
4

Comment est-il préférable que ces services soient répartis sur différentes machines?

À cause du cloud.

Vous avez encore ri? Sérieusement, pour de nombreuses entreprises, le plus gros coût du logiciel n'est plus le logiciel. C'est la bande passante, le matériel, les coûts CDN, etc. Maintenant que tout le monde a un appareil mobile, il y a juste beaucoup plus de trafic. Et cela ne fera qu'empirer lorsque votre grille-pain obtient sa propre connectivité Internet.

Les entreprises cherchent donc à gérer ces coûts. Plus précisément, ils essaient de gérer le problème commercial de "si cette chose explose, comment puis-je servir des millions de personnes obtenant / utilisant mon logiciel - sans payer à l'avance pour que les serveurs servent des millions de personnes obtenant / utilisant mon logiciel ? ".

Pourquoi la mise à l'échelle horizontale est-elle si répandue ou du moins souhaitable?

Parce qu'il répond à ce problème commercial (énorme et croissant).

Lorsque vous avez une douzaine d'utilisateurs, vous pouvez lancer tous les services sur une seule boîte. C'est bien, car vous ne voulez payer qu'une seule boîte. Et vous ne voulez pas non plus payer les modifications apportées à l'application pour diviser les différents services lorsque votre entreprise évolue. De nos jours, vous n'avez pas le temps de le faire avant que la foule de clients n'allume vos serveurs de toute façon.

C'est aussi bien car cela vous permet de jongler avec les allocations de serveur afin de pouvoir:

  1. utilisez la plupart des serveurs dont vous disposez, ne laissant que peu de «déchets».
  2. mesurer les performances des éléments individuels de votre logiciel.
  3. réduire le déploiement / les temps d'arrêt causés par les versions.

Avoir des déploiements très granulaires rend ces deux choses plus faciles / meilleures (en plus d'aider à imposer une meilleure séparation des préoccupations).

Telastyn
la source
Ok, je peux voir l'avantage. La barrière à l'entrée est faible, mais elle peut évoluer. Je suppose que ce qui me pousse à faire une boucle, c'est lorsque vous évoluez horizontalement dans des MS, il semble juste ... très ... rétro? Quelque chose. Je ne peux pas expliquer pourquoi cela semble tout simplement faux.
Thufir
La mise à l'échelle des applications est un problème qui n'a pas nécessairement besoin de microservices: vous pouvez augmenter la puissance d'une machine virtuelle très facilement sur AWS (même à la demande), ou vous pouvez ajouter plus de machines virtuelles derrière un équilibreur de charge dans une architecture traditionnelle.
xtian
@xtian - bien sûr, mais vous redimensionnez souvent les mauvaises choses et dépensez donc plus d'argent que nécessaire. L'idée derrière les microservices est que vous dimensionnez simplement ce dont vous avez besoin (cpu, mémoire, disque, débit, gpu)
Telastyn