Tengo un problema. ¡Usemos microservicios! Ahora tengo 13 problemas distribuidos.
Es una buena idea dividir su sistema en componentes encapsulados, cohesivos y desacoplados. Te 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 obtendrá ninguna ventaja arquitectónica. Obtiene cierta flexibilidad con respecto a la elección de tecnología y posiblemente (pero no necesariamente) escalabilidad. Pero tiene garantizado algunos dolores de cabeza derivados de (a) la naturaleza distribuida del sistema y (b) la comunicación entre los componentes. Elegir microservicios significa que tiene otros problemas tan urgentes que está dispuesto a usar microservicios a pesar de estos problemas.
Si no puedes diseñar un monolito que esté bien dividido en componentes, tampoco podrás 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 se rompe horriblemente. 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 se hará evidente hasta que los integre, y en ese momento ya es demasiado tarde para arreglar la arquitectura general.
La fuente de errores No 1 es la falta de coincidencia de 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 , el código siempre se ejecuta. 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 pase a un lenguaje de descripción de servicio formal, no puede verificar ningún tipo de corrección en el uso de su interfaz. Tienes que probar, probar, probar! Pero las pruebas son caras y, por lo general, no son exhaustivas, lo que deja la posibilidad de que aún puedan existir 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 hilarantemente peligrosamente equivocada, a menos que la posibilidad de pérdida de datos le divierta.