Últimamente he estado leyendo mucho sobre microservicios, y aquí están algunas de las conclusiones que obtuve hasta ahora (corríjame si me equivoco en algún momento).
- La arquitectura de microservicios combina bien con el diseño dirigido por dominios. Por lo general, una MS representa un contexto acotado.
- Si el microservicio A requiere una funcionalidad que reside en el microservicio B , mi modelo probablemente esté equivocado y A y B en realidad deberían ser un micro servicio / BC.
- La comunicación sincrónica entre microservicios (solicitudes HTTP directas) es mala, porque desafía el propósito de los microservicios e introduce el acoplamiento entre componentes.
- La comunicación asincrónica entre servicios es deseable. Los servicios deben publicar eventos en las colas de mensajes, para que otros servicios puedan suscribirse y procesar su parte del evento, o usarlo para replicar una parte de los datos necesarios para su contexto. De esta manera, los servicios pueden procesar solicitudes, incluso otros servicios están inactivos, lo que no sería el caso en la comunicación sincrónica.
- Si el microservicio A publica un evento, el microservicio B se suscribe a ese evento y produce un nuevo evento como resultado, el microservicio A no debe ser el que procesa el evento recién creado, ya que sería una dependencia circular. En este caso, debemos introducir un tercer microservicio o combinar A y B en el microservicio AB .
- El microservicio es en realidad un término engañoso. Deberíamos luchar por contextos pequeños, pero ese no tiene por qué ser el caso. El término no debe ser "microservicio", sino "lo suficientemente grande como para hacer el servicio de trabajo ".
- Los microservicios nos permiten introducir nuevas funcionalidades con más facilidad y sin temor a que rompamos todo el sistema. Se puede hacer introduciendo un nuevo servicio o refactorizando uno de los existentes.
- Cada microservicio debe tener su propio almacenamiento de datos. La replicación / duplicación de datos es un comportamiento deseable en esta arquitectura.
Además de confirmar mi comprensión de esta arquitectura, mi otra parte de la pregunta está relacionada principalmente con el descubrimiento de servicios. Si los servicios se comunican de forma asíncrona y utilizan una cola de eventos central como Amazon SQS, ¿eso significa que el descubrimiento de servicios no tiene su lugar en una arquitectura como esa?
Los servicios no deben tener ningún conocimiento sobre otros servicios en el sistema. ¿Solo conocen su contexto y los eventos a los que deberían publicar o suscribirse?
Los microservicios tratan de desacoplar diferentes dominios de funcionalidad. Cada servicio puede ser desarrollado a un ritmo diferente, por un equipo diferente, usando una pila de tecnología diferente. Esto crea flexibilidad organizacional. La compensación es la complejidad operativa, donde cada servicio adicional crea una cosa más que debe administrarse en un entorno operativo. Por lo tanto, la compensación fundamental del monolito frente al microservicio no se trata de evitar dependencias, se trata de evitar el desarrollo y la implementación de pasos de bloqueo donde todo debe enviarse de una vez, sino a costa de tener que enviar más a menudo porque hay Más partes móviles.
El problema de evitar la dependencia es una pista falsa. Siempre tendrá dependencias entre las piezas de su producto, y si están en un servicio separado o parte del mismo código no altera el hecho de que las dependencias pueden romperse. Pueden romperse a nivel operativo, porque un servidor clave se cae, y usted lo gestiona a través de prácticas de redundancia operativa y de conmutación por error. También pueden romperse en el nivel de integración, porque las partes cambian de manera incompatible, lo que detecta a través de las pruebas de integración. Mezclar código entre servicios no resuelve el problema de dependencias potencialmente rotas. Las soluciones para evitar dependencias interrumpidas son la redundancia operativa y las pruebas de integración, que no tienen nada que ver con el tamaño de sus servicios.
Para responder a esa pregunta, primero responda esta: ¿por qué desea comunicarse de forma asincrónica? ¿Es para facilitar el desarrollo independiente de componentes separados? ¿Es para mejorar la disponibilidad operativa de un sistema 24/7? Digamos que es lo último y desea utilizar colas para replicar datos en bases de datos locales. Bueno, ahora sus datos pueden estar obsoletos. En algún momento será demasiado rancio. ¿Cómo lidias con eso? Además, ¿cómo se asegura la disponibilidad operativa de la cola, que es otro componente de tiempo de ejecución? ¿Y cómo se asegura la disponibilidad de esas bases de datos locales? En lugar de administrar un clúster de base de datos, ahora tiene varios. ¿Puede su equipo de operaciones manejar esta carga de trabajo? Y realmente, ¿vale la pena la complejidad, cuando quizás sus usuarios estarían más felices con más funciones y unas pocas horas de tiempo de inactividad cada mes si construyera un monolito simple?
Creo que entiendes mi punto. El diseño del sistema no se trata de lo correcto o incorrecto, se trata de elegir entre una amplia variedad de compensaciones. Todo lo que está mal puede estar bien, y viceversa, si solo lo ves en el contexto correcto. Su contexto es exclusivo para usted, por lo que si bien podemos darle una respuesta, no será la respuesta. Recuerde quién es su audiencia, cuáles son sus necesidades y se revelará el diseño correcto.
fuente
Discrepar. DDD tiende a ser muy OO. se entrega un pedido? Order.Deliver () mientras que los microservicios tendrían DeliveryService.Deliver (orden)
En desacuerdo, debe intentar mantener sus micro servicios micro. dividirlos aún más pequeños!
Discrepar. los servicios no deberían preocuparse por quién los está llamando y las personas que llaman no deberían preocuparse de que la lógica se implemente en un microservicio.
Las colas son buenas. Pero tu razonamiento está mal. La única diferencia entre las respuestas de sincronización y las asíncronas es que espera la sincronización. Puede implementar llamadas de estilo RPC con colas y múltiples trabajadores sin problemas.
Discrepar. No es una dependencia circular porque sus microservicios no están acoplados. También desea atender reenviar senarios, SendEmail, EmailFailed, SendAgain no necesita 3 microservicios
Discrepar. Echa un vistazo a los nano-servicios.
Discrepar. Sí, se desacopla, pero la orquestación de microservicios puede ser tan desalentadora como cualquier proyecto monolítico.
Discrepar. Aunque no debería compartir el almacenamiento, sus microservicios deberían tratar de no tener estado cuando sea posible. no duplique datos a menos que esté en vuelo
fuente
Sus conclusiones son buenas reglas generales, pero no universales. Habrá casos en que la mejor opción es romper estas reglas, incluso en un proyecto greenfield. En algunos casos, la comunicación sincrónica es la mejor opción. En algunos casos, no es bueno fusionar dos servicios en uno, incluso si están acoplados por comunicación sincrónica.
Y a su otra pregunta, el descubrimiento de servicios no es necesario para la comunicación basada en la cola.
fuente
Um, solo estás hablando de programación orientada a objetos. O al menos, lo que originalmente fue concebido para ser: piezas independientes de código en ejecución que se comunican entre sí mediante mensajes.
Alan Kay concibió la OOP como un modelo de sistemas biológicos, donde las células son relativamente independientes entre sí y solo se comunican a través de mensajes que se conectan a interfaces externas en otras células.
Entonces, ¿por qué dejamos de pensar en ello como OOP solo porque todos los objetos no se ejecutan en la misma computadora? En todo caso, eso es aún más orientado a objetos. a que si están en la misma computadora y parte de la misma aplicación, porque si todos los objetos están en la misma aplicación, los desarrolladores a menudo rompen OOP al usar variables globales compartidas por todas las clases y incluyendo los mismos encabezados en cada archivo, etc. Cuando todos los objetos dependen de las mismas cosas, no están tan encapsulados como si fueran completamente independientes entre sí, y la encapsulación es el objetivo de OOP.
Por ejemplo, casi todo lo que se dice en las otras respuestas son declaraciones de libros de texto sobre OOP.
fuente
Dado que a menudo encuentro una comprensión errónea de un concepto tan importante como Contexto acotado y Dominio central, me gustaría dar un poco más de detalles.
Me pareció extremadamente rentable pensar en subdominios como en capacidades empresariales. La capacidad empresarial es algo que hace su organización. Es una de sus funciones comerciales. Dado que nuestro objetivo es la alineación entre negocios y TI , definitivamente quiero que tengan una relación 1: 1 con mis servicios técnicos .
Entonces este proceso se reduce a lo siguiente. Primero, defino las capacidades empresariales de nivel superior. Debe tomar la forma de sustantivo y verbo (o alguna forma derivada). Por lo general, hay menos de 10 capacidades comerciales. Luego, soy inmensamente más profundo, identificando capacidades anidadas. Y así sucesivamente, hasta que no haya nada que dividir. Las capacidades que utilizó para utilizar este enfoque reflejan el dominio real, la forma real en que funciona su organización. Estas capacidades se acoplarán de manera innata y flexible, por lo que si asigna sus servicios técnicos a estas capacidades, serán autónomas y estarán basadas en eventos. Este proceso se denomina mapeo de capacidad empresarial , pero hay otras formas de encontrar sus servicios, la más importante de las cuales es probablemente el Análisis de la cadena de valor .
Aquí hay un ejemplo de identificación de límites de servicio utilizando este enfoque.
fuente