El siguiente comentarista escribe :
Los microservicios cambian su disfunción organizacional de un problema de tiempo de compilación a un problema de tiempo de ejecución.
Este comentarista se expande sobre el tema diciendo:
Característica no error. Problema de tiempo de ejecución => problemas de producción => comentarios más fuertes y rápidos sobre la disfunción a los responsables
Ahora lo entiendo con microservicios :
- potencialmente aumenta la latencia de su rendimiento, lo cual es una preocupación de producción y tiempo de ejecución.
- aumente el número de "interfaces de red" en su código donde podría haber posibles errores de análisis en tiempo de ejecución.
- potencialmente puede hacer implementaciones azul-verde. Esos podrían ser retenidos por desajustes de interfaz (ver interfaces de red). Pero si los despliegues azul-verdes funcionan, entonces es más una preocupación de tiempo de ejecución.
Mi pregunta es: ¿qué significa que cambiar a microservicios crea un problema de tiempo de ejecución?
microservices
runtime
compile-time
ojo de halcón
fuente
fuente
Respuestas:
Tengo un problema. ¡Usemos Microservicios! Ahora tengo 13 problemas distribuidos.
Dividir su sistema en componentes encapsulados, cohesivos y desacoplados es una buena idea. Le permite abordar diferentes problemas por separado. Pero puede hacerlo perfectamente bien en una implementación monolítica (consulte Fowler: Microservice Premium ). Después de todo, ¡esto es lo que OOP ha estado enseñando durante muchas décadas! Si decide convertir sus componentes en microservicios, no obtiene ninguna ventaja arquitectónica. Obtiene cierta flexibilidad con respecto a la elección de tecnología y posiblemente (¡pero no necesariamente!) Algo de escalabilidad. Pero tiene garantizado algún dolor de cabeza derivado de (a) la naturaleza distribuida del sistema y (b) la comunicación entre los componentes. Elegir microservicios significa que tiene otros problemas que son tan apremiantes que está dispuesto a usar microservicios a pesar de estos problemas.
Si no puede diseñar un monolito que esté dividido limpiamente en componentes, tampoco podrá diseñar un sistema de microservicio. En una base de código monolítico, el dolor será bastante obvio. Idealmente, el código simplemente no se compilará si está horriblemente roto. Pero con los microservicios, cada servicio puede desarrollarse por separado, posiblemente incluso en diferentes idiomas. Cualquier problema en la interacción de los componentes no será evidente hasta que los integre, y en ese punto ya es demasiado tarde para arreglar la arquitectura general.
La fuente número 1 de errores es la falta de coincidencia de la interfaz. Puede haber errores evidentes, como un parámetro faltante, o ejemplos más sutiles, como olvidar verificar un código de error u olvidar verificar una condición previa antes de llamar a un método. La escritura estática detecta estos problemas lo antes posible: en su IDE y en el compilador, antes de que se ejecute el código. Los sistemas dinámicos no tienen este lujo. No explotará hasta que se ejecute ese código defectuoso.
Las implicaciones para los microservicios son aterradoras. Los microservicios son inherentemente dinámicos. A menos que cambie a un lenguaje de descripción de servicio formal, no puede verificar ningún tipo de corrección del uso de su interfaz. tienes que probar, probar, probar! Pero las pruebas son caras y generalmente no exhaustivas, lo que deja la posibilidad de que todavía existan problemas en la producción. ¿Cuándo se hará evidente ese problema? Solo cuando se toma ese camino defectuoso, en tiempo de ejecución, en producción. La noción de que los problemas de producción conducirían a una retroalimentación más rápida es
hilarantementepeligrosamente incorrecto, a menos que le divierta la posibilidad de pérdida de datos.fuente
El primer tweet fue mío, así que lo ampliaré:
Supongamos que tiene 100 desarrolladores que trabajan en una aplicación monolítica. Esa es demasiada gente para comunicarse de manera efectiva entre sí, por lo que la compañía tiene que trabajar duro para dividirlos en equipos más pequeños y crear buenos patrones de comunicación entre ellos. Cuando la organización es "disfuncional", los equipos probablemente no están hablando entre sí, no están alineados con un objetivo más amplio, no están de acuerdo con las prioridades, etc. Como resultado, les lleva una eternidad enviar algo. Es un "problema de tiempo de compilación" en el sentido de que la disfunción es obvia antes de que se produzca el software. El proyecto es probablemente una marcha de la muerte o nunca se enviará ("compilar").
Creo que muchas personas se sienten atraídas por los microservicios y se están mudando a ellos, no por los beneficios técnicos / arquitectónicos inherentes, sino porque les permite ignorar la disfunción organizacional. En lugar de tratar de alinear a 100 desarrolladores, esperan poder tener pequeños equipos trabajando en silos, cada uno enfocado en su propio pequeño micro servicio. Si está en una organización tan disfuncional, esto es muy atractivo: le da un permiso mucho mayor para evitar a las personas que no le gustan, para no comunicarse.
Desafortunadamente, se convierte en un "problema de tiempo de ejecución" porque una vez que el software se está ejecutando en producción, la buena comunicación se vuelve igual de importante. Los problemas con la organización (los equipos y cómo se alinean y comunican) se manifiestan en el "tiempo de ejecución".
El punto de mi tweet fue: si lo que tienes es un problema de personas , una nueva arquitectura no va a ayudar. Solo retrasará los efectos del problema. Creo que el atractivo de los microservicios para muchas personas es la esperanza de que resuelva mágicamente estos problemas.
fuente
¡Eso no es lo que dicen esos tweets! No dicen nada sobre el cambio a microservicios , ni dicen nada sobre la creación de problemas. Solo dicen algo sobre problemas cambiantes .
Y ponen una restricción contextual en sus afirmaciones, a saber, que su organización es disfuncional.
Entonces, lo que el primer tweet dice básicamente es dos cosas:
El segundo tweet dice que el hecho de que los problemas solo se manifiesten en la producción, es decir, donde los clientes los ven, es una característica, no un error, porque cuando los clientes se quejan, eso tiende a escucharse en lugares diferentes de cuando se rompe una construcción, es decir en lugares que pueden hacer algo con respecto a la disfunción organizacional (por ejemplo, gestión de alto nivel). Dado que la disfunción organizacional generalmente es una falla de la administración de alto nivel, esto significa que los clientes insatisfechos reflexionan mal sobre aquellos que finalmente son responsables de esa insatisfacción, mientras que la baja calidad del código causada por fallas de administración de alto nivel generalmente solo refleja mal sobre los desarrolladores, que son , sin embargo, no tiene la culpa y no puede hacer algo al respecto.
Entonces, el primer tweet dice que los microservicios mueven los problemas causados por una mala administración desde el momento de la compilación, donde solo los desarrolladores los ven, hasta el tiempo de ejecución, donde los clientes los ven. El segundo tweet dice que es algo bueno, porque entonces, los problemas perjudican a los responsables de ellos.
fuente
Crea un problema de tiempo de ejecución en lugar de un problema de tiempo de compilación .
Una aplicación monolítica es difícil y costosa de compilar. Pero una vez que se compila, puede estar razonablemente seguro de que no existen incompatibilidades extremadamente estúpidas entre los componentes, porque el sistema de tipos puede atraparlos. El mismo error en un sistema de microservicios podría no aparecer hasta que dos componentes específicos realmente interactúen de una manera específica.
fuente
Tanto en sistemas monolíticos como en microservicios, debe definir interfaces entre los subsistemas. Las interfaces deben estar bien diseñadas, bien documentadas y lo más estables posible. Esto es lo mismo que en OOP.
Si su organización no puede hacer esto, los microservicios tampoco resolverán el problema. En microservicios tienes interfaces web públicas. Por lo tanto, incluso tiene que dedicar más esfuerzo al diseño de la interfaz.
Si la interfaz no está diseñada correctamente, obtendrá dos tipos de problemas de tiempo de ejecución:
Creo que producir problemas de tiempo de ejecución no es la forma correcta de comunicar los problemas de organización a los responsables.
fuente