Hablemos de aspectos positivos y negativos del enfoque de microservicio.
Primeros negativos. Cuando crea microservicios, agrega complejidad inherente a su código. Estás agregando gastos generales. Estás haciendo más difícil replicar el entorno (por ejemplo, para desarrolladores). Estás dificultando la depuración de problemas intermitentes.
Permítanme ilustrar un verdadero inconveniente. Considere hipotéticamente el caso en el que tiene 100 microservicios llamados mientras genera una página, cada uno de los cuales hace lo correcto el 99.9% del tiempo. Pero el 0.05% de las veces producen resultados incorrectos. Y el 0.05% del tiempo hay una solicitud de conexión lenta donde, por ejemplo, se necesita un tiempo de espera de TCP / IP para conectarse y eso lleva 5 segundos. Alrededor del 90.5% de las veces su solicitud funciona perfectamente. Pero alrededor del 5% del tiempo tiene resultados incorrectos y alrededor del 5% del tiempo su página es lenta. Y cada falla no reproducible tiene una causa diferente.
A menos que piense mucho en las herramientas para monitorear, reproducir, etc., esto se convertirá en un desastre. Particularmente cuando un microservicio llama a otro que llama a otro unas pocas capas de profundidad. Y una vez que tenga problemas, solo empeorará con el tiempo.
OK, esto suena como una pesadilla (y más de una compañía se ha creado enormes problemas al seguir este camino). El éxito solo es posible. Usted es claramente consciente del potencial inconveniente y trabaja constantemente para abordarlo.
Entonces, ¿qué pasa con ese enfoque monolítico?
Resulta que una aplicación monolítica es tan fácil de modularizar como los microservicios. Y una llamada a la función es más barata y más confiable en la práctica que una llamada RPC. Por lo tanto, puede desarrollar lo mismo, excepto que es más confiable, se ejecuta más rápido e implica menos código.
Bien, entonces ¿por qué las empresas recurren al enfoque de microservicios?
La respuesta es porque a medida que escala, hay un límite de lo que puede hacer con una aplicación monolítica. Después de tantos usuarios, tantas solicitudes, etc., llega a un punto en el que las bases de datos no se escalan, los servidores web no pueden guardar su código en la memoria, etc. Además, los enfoques de microservicio permiten actualizaciones independientes e incrementales de su aplicación. Por lo tanto, una arquitectura de microservicio es una solución para escalar su aplicación.
Mi regla general es que pasar del código en un lenguaje de script (por ejemplo, Python) a C ++ optimizado generalmente puede mejorar 1-2 órdenes de magnitud tanto en el rendimiento como en el uso de la memoria. Ir al otro lado a una arquitectura distribuida agrega una magnitud a los requisitos de recursos, pero le permite escalar indefinidamente. Puede hacer que una arquitectura distribuida funcione, pero hacerlo es más difícil.
Por lo tanto, diría que si está comenzando un proyecto personal, vaya monolítico. Aprende a hacerlo bien. No se distribuya porque (Google | eBay | Amazon | etc) son. Si aterriza en una gran empresa que se distribuye, preste mucha atención a cómo lo hacen funcionar y no lo arruine. Y si terminas teniendo que hacer la transición, ten mucho cuidado porque estás haciendo algo difícil que es muy fácil equivocarte.
Divulgación, tengo cerca de 20 años de experiencia en empresas de todos los tamaños. Y sí, he visto arquitecturas monolíticas y distribuidas de cerca y personal. Se basa en esa experiencia que le estoy diciendo que una arquitectura de microservicio distribuido realmente es algo que hace porque lo necesita, y no porque de alguna manera sea más limpia y mejor.