¿Hemos cerrado el círculo con microservicios, volviendo a los enfoques de la vieja escuela?

9

En términos de arquitectura y diseño de software, ¿cómo se "apilan" los microservicios (juego de palabras) contra el middleware? Vengo de Java, y parece que cuando te alejas de REST directo como API y abstraes diferentes capas y parámetros de conexión, al menos en Java, casi has cerrado el círculo de vuelta a algunas ideas de la vieja escuela. . Hemos vuelto a la virtualización ... donde la JVM ya es virtual.

De una manera agnóstica, usted puede, y yo diría, las ventajas de abstraer una API RESTful a CORBA. O, de una manera más centrada en Java, JMS o MDB.

Hubo un tiempo en que EJB era un gran problema en Java, luego se reconoció un poco como un clúster, pero, ahora, ¿volvemos al principio?

¿O los microservicios ofrecen algo que CORBA, o incluso mejor, MDB, carece? Cuando leo (TLDR) Martin Fowler explicando microservicios, me parece una buena solución a un mal problema, por así decirlo. O más bien, un enfoque de mente cerrada que introduce un nivel de complejidad que solo empuja el problema. Si los servicios son verdaderamente micro y numerosos, cada uno tiene un costo en dólares para ejecutarlo y mantenerlo.

Además, si un micro servicio entre muchos cambia su API, entonces todo lo que depende de ese servicio se rompe. No parece estar débilmente acoplado, parece lo contrario de ágil. ¿O estoy haciendo mal uso de esas palabras?

Por supuesto, hay una cantidad indeterminada de opciones entre estos extremos.

Tiburón contra Gorila ... ¡vete! (Para los pedantes, eso debe ser irónico, y no es mi intención en absoluto. La pregunta debe tomarse al pie de la letra. Si la pregunta puede mejorarse, hágalo o comente y lo solucionaré. )

Imagine una multitud de microservicios que se ejecutan en la ventana acoplable, todos en una máquina, hablando entre ellos ... locura. Difícil de mantener o administrar, y casi imposible cambiar algo porque cualquier cambio se producirá en cascada y causará errores imprevisibles. ¿Cómo es de alguna manera mejor que estos servicios estén dispersos en diferentes máquinas? Y, si se distribuyen, entonces seguramente algunas técnicas muy, muy antiguas de la escuela han resuelto, al menos hasta cierto punto, la informática distribuida.

¿Por qué la escala horizontal es tan frecuente, o al menos deseable?

Thufir
fuente
44
Votación para cerrar. No está claro qué está preguntando y por qué lo está preguntando. La arquitectura de microservicios es solo otra arquitectura. Nada más y nada menos.
davidk01
1
También puede encontrar este artículo que vale la pena: devweek.com/blog/microservices-the-good-the-bad-and-the-ugly
davidk01
1
Prefiero "Así que ahora tienen cientos de pequeños servicios falsos, y en lugar de un monolito, tienen que preocuparse por lo que sucede cuando alguien quiere cambiar el contrato de uno de esos servicios. Una bola de hilo, con un nombre diferente. En cambio de preguntarse si el código se compilará si hacen un cambio, se preguntan si se ejecutará, en la práctica ". - microservicios para barbudos gruñones descargo de responsabilidad: no, no soy barba para el cuello, es solo un artículo humorístico.
Thufir
"En lugar de preguntarse si el código se compilará ... se preguntan si se ejecutará ..." De hecho, esto no es un problema en absoluto. Simplemente porque si un desarrollador cambia un contrato sin notificar a todas las partes involucradas, ese desarrollador debe recibir una palmada muy dura. Literalmente. Si usamos contrato a término, ¿imagina si su proveedor de servicios móviles cambia los términos del contrato sin preguntarle / informarle? Es por eso que es un contrato: todas las partes involucradas deben conocer / acordar los cambios del contrato y, cuando ocurra este cambio (suponiendo un flujo de desarrollo adecuado), todos deben probarse y ejecutarse sin problemas.
Alexey Kamenskiy
1
@Thufir Como se dijo antes de la EM, es solo otro enfoque, tendrá sus beneficios y sus desventajas. De hecho, trabajé con este enfoque (incluso antes de escuchar que tenía un nombre especial) en múltiples proyectos. Como nota al margen: no es una cascada, es lo que tú haces. Mientras trabajaba para un proyecto que desarrollaba (en equipo) parte del sistema operativo móvil, este enfoque es la única forma de hacerlo porque el sistema operativo no se puede crear giant blob, ya que tiene que tener interfaces, por lo que cada parte que comienza desde el núcleo es una especie de MS, y lo primero es antes cualquier equipo comenzó a escribir código para acordar las especificaciones v0.0.1.
Alexey Kamenskiy

Respuestas:

2

TL; DR. He tenido el placer de beber una gran cantidad de Kool-Aid con sabor a Microserver, por lo que puedo hablar un poco sobre las razones detrás de ellos.

Pros:

  • Los servicios saben que sus dependencias son estables y han tenido tiempo de hornear
  • Permitir implementaciones continuas de nuevas versiones
  • Permita que los componentes se reviertan sin afectar las capas superiores.

Contras:

  • No puede usar las características nuevas y brillantes de sus dependencias.
  • Nunca se puede romper la compatibilidad con versiones anteriores de API (o al menos no durante muchos ciclos de desarrollo).

Creo que fundamentalmente no entiendes cómo se supone que funciona una arquitectura de microservicio. La forma en que se supone que se ejecuta es que cada microservicio (denominado en adelante MS) tiene una API rígida en la que todos sus clientes están de acuerdo. El MS puede realizar los cambios que desee siempre que se conserve la API. La MS se puede descartar y reescribir desde cero, siempre que se conserve la API.

Para ayudar en el acoplamiento suelto, cada MS depende de la versión n-1 de sus dependencias. Esto permite que la versión actual del servicio sea menos estable y un poco más arriesgada. También permite que las versiones salgan en oleadas. Primero se actualiza 1 servidor, luego la mitad y finalmente el resto. Si la versión actual alguna vez desarrolla problemas serios, la MS puede revertirse a una versión anterior sin pérdida de funcionalidad en otras capas.

Si la API necesita ser cambiada, debe cambiarse de una manera que sea compatible con versiones anteriores.

Konstantin Tarashchanskiy
fuente
"La MS se puede descartar y reescribir desde cero, siempre que se conserve la API". No hay nada nuevo allí, pero está bien. En términos de rendimiento, en el extremo opuesto del espectro, ¿cómo se comparan todos estos MS con una aplicación / servicio / sistema monolítico? En términos de distribución, parece , y corríjame si está equivocado, que hay una ganancia potencial de rendimiento al poner n MS en una sola máquina ... ¿virtualizado en un mainframe? Es casi como cuanto más escalas MS horizontalmente, más simple se vuelve escalar verticalmente ...? Puntos de bonificación por no leer mi pregunta :)
Thufir
1
Al igual que con cualquier capa de indirección, estás recibiendo un golpe de rendimiento en comparación con una gran bola de barro. En el caso de la EM, es particularmente costoso ya que realiza un viaje de ida y vuelta a la red en cada llamada. El uso de virtualización o contenedores hace que este viaje de ida y vuelta sea significativamente más corto ya que la llamada nunca sale de la máquina. También significa que obtienes más aislamiento (un servicio fuera de control no puede dañar a sus compañeros) con un menor costo de hardware.
Konstantin Tarashchanskiy
5

Todas las técnicas de desarrollo de software que hemos inventado han sido sobre la gestión de la complejidad de alguna manera. Una gran parte de ellos ha sido y sigue siendo sobre abstracción, encapsulación y acoplamiento flexible. Los microservicios son otra forma de hacer esas cosas, por lo que probablemente se parece a muchas técnicas antiguas de alto nivel teórico, pero eso no lo hace menos útil o relevante.

Con respecto al acoplamiento flojo, creo que has entendido mal el objetivo un poco. Si la tarea A necesita llamar a la tarea B, nunca habrá forma de hacer que A y B estén 100% desacopladas. Nunca va a pasar. Lo que puede hacer es asegurarse de que, si la tarea B llama a la tarea C, la tarea C nunca debería tener que preocuparse por los cambios a A. Si estas tres tareas están unidas en una gran burbuja, pasando estructuras entre sí, entonces hay un posibilidad significativa de que todos tengan que cambiar si alguno de ellos lo hace. Pero si los tres son microservicios, entonces básicamente está garantizado que un cambio en A solo obligará a B a actualizarse (a menos que sea un cambio tan grande en la funcionalidad central de A que probablemente debería haberlo convertido en un servicio completamente nuevo). Esto es especialmente cierto si todas las actualizaciones de microservicios se realizan de forma compatible con versiones anteriores, como deberían ser.

Con respecto al comentario ágil, puedo decirle por experiencia personal que nuestro código de microservicio funciona mucho mejor con el código ágil que nuestro código "vinculado a un gran blob". En el último, cada vez que alguien corrige un error en una función de bajo nivel, literalmente tiene que enviar un correo electrónico a todo el departamento de I + D diciendo "por favor vuelva a vincular sus tareas o todos se estrellarán el viernes". Recibimos un par de estos cada semana . Si su código estuviera en un microservicio, todos nos beneficiaríamos automáticamente de la solución tan pronto como implementara una nueva versión.

No entiendo completamente el comentario sobre COBRA y MDB, ya que no parecen ser arquitecturas de software sino componentes de una; Según tengo entendido, son formas potenciales de definir los protocolos de mensajería de sus microservicios y / o implementar dichos microservicios, no en sí mismas alternativas a los microservicios.

Ixrec
fuente
1
"Si estas tres tareas están unidas en una gran burbuja ..." Solo tengo una perspectiva Java sobre esto, pero diría "no", mala idea, no hagas eso. Cree una biblioteca, API # 1, API # 2, etc., para lograr su punto exacto de "..tarea C nunca debería tener que preocuparse por los cambios en A", porque C es un cliente de B solamente y no de A en absoluto . En ese sentido, no lo veo como algo nuevo, perdón. Sé que la pregunta que hice fue confusa. Es una pregunta confusa porque estoy confuso sobre de qué se trata. Todas y cada una de las respuestas me han sido útiles, aunque solo sea para ayudar con mi vocabulario.
Thufir
1
@Thufir Si todas las bibliotecas están vinculadas dinámicamente y todas las tareas se ejecutan exactamente en el mismo conjunto de máquinas, entonces tiene razón, eso permitiría un despliegue por separado. Pero los microservicios le permiten descartar incluso esas suposiciones, si quiere llegar tan lejos con el desacoplamiento. Es completamente razonable no hacerlo.
Ixrec
CORBA es (era) una tecnología distribuida que permitía arquitecturas distribuidas en un momento (finales de 1990) cuando aún no había nombres generalizados para definirlas. Usted era libre de implementar sistemas basados ​​en CORBA de grano grueso o fino que terminaban en lo que luego se llamaría SOA o Microservicios. CORBA no sobrevivió, pero lo estamos haciendo nuevamente, solo con una tecnología diferente. Sin embargo, el problema no era la tecnología. Entonces sí, vamos a cerrar el círculo. Espero que hayamos aprendido algo en el proceso.
xtian
4

¿Cómo es de alguna manera mejor que estos servicios estén dispersos en diferentes máquinas?

Por la nube.

¿Ya te has reído? Sin embargo, en serio: para muchas empresas, el mayor costo del software ya no es el software. Es el ancho de banda, el hardware, los costos de CDN, etc. Ahora que todos tienen un dispositivo móvil, hay mucho más tráfico. Y eso solo empeorará a medida que su tostadora tenga su propia conectividad a Internet.

Por lo tanto, las empresas buscan administrar esos costos. Específicamente, están tratando de manejar el problema comercial de "si esto explota, ¿cómo puedo servir a millones de personas que obtienen / usan mi software, sin pagar por adelantado por los servidores que sirven a millones de personas que obtienen / usan mi software? ? ".

¿Por qué la escala horizontal es tan frecuente, o al menos deseable?

Porque responde a este problema comercial (enorme y creciente).

Cuando tiene una docena de usuarios, puede lanzar todos los servicios en una caja. Esto es bueno, ya que solo quieres pagar por una caja. Y tampoco desea pagar por los cambios en la aplicación para dividir los diversos servicios cuando su empresa escala. En estos días, no tiene tiempo para hacerlo antes de que la multitud de clientes encienda sus servidores de todos modos.

También es bueno porque le permite hacer malabares con las asignaciones de servidores para que pueda:

  1. usa la mayoría de los servidores que tienes, dejando poco para "desperdiciar".
  2. Mida el rendimiento de los elementos individuales de su software.
  3. reducir el tiempo de despliegue / inactividad causado por lanzamientos.

Tener implementaciones muy granulares hace que esas dos cosas sean más fáciles / mejores (además de ayudar a forzar una mejor separación de las preocupaciones).

Telastyn
fuente
Ok, puedo ver la ventaja. Hay una barrera de entrada baja, pero puede aumentar. Supongo que lo que me da vueltas es cuando escalas horizontalmente en MS, simplemente parece ... muy ... ¿retro? Alguna cosa. No puedo decir por qué parece que está mal.
Thufir
El escalado de aplicaciones es un problema que no necesariamente necesita microservicios: puede aumentar la potencia de una VM muy fácilmente en AWS (incluso bajo demanda), o puede agregar más VM detrás de un equilibrador de carga en una arquitectura tradicional.
xtian
@xtian: claro, pero a menudo estás escalando las cosas equivocadas y gastando más dinero del que necesitas. La idea detrás de los microservicios es escalar lo que necesita (CPU, memoria, disco, rendimiento, GPU)
Telastyn