Gestión de datos descentralizada: encapsulación de bases de datos en microservicios [cerrado]


23

Recientemente he estado tomando un curso sobre diseño de software y recientemente hubo una discusión / recomendación sobre el uso de un modelo de 'microservicios' en el que los componentes de un servicio se separan en subcomponentes de microservicio que son lo más independientes posible.

Una parte que se mencionó fue que, en lugar de seguir el modelo muy frecuente de tener una sola base de datos con la que hablan todos los microservicios, tendría una base de datos separada ejecutándose para cada uno de los microservicios.

Puede encontrar una explicación mejor y más detallada de esto aquí: http://martinfowler.com/articles/microservices.html en la sección Gestión de datos descentralizada

la parte más destacada que dice esto:

Los microservicios prefieren dejar que cada servicio administre su propia base de datos, ya sea diferentes instancias de la misma tecnología de base de datos o sistemas de bases de datos completamente diferentes, un enfoque llamado Polyglot Persistence. Puede usar la persistencia políglota en un monolito, pero aparece con más frecuencia con microservicios.

Figura 4ingrese la descripción de la imagen aquí

Me gusta este concepto y, entre muchas otras cosas, lo veo como una gran mejora en el mantenimiento y tener proyectos con varias personas trabajando en ellos. Dicho esto, de ninguna manera soy un arquitecto de software con experiencia. ¿Alguien ha intentado alguna vez implementarlo? ¿Qué beneficios y obstáculos te encontraste?


66
No estoy seguro de cómo esta pregunta está fuera del alcance de programmers.stackexchange. Es una pregunta sobre una técnica específica y sus ventajas y desventajas para determinar cuándo mereció el uso de la técnica. He mirado el recorrido y el meta sitio ( meta.stackexchange.com/questions/68384/… ). ¿Podría por favor aclarar cómo debo mejorar la pregunta?
ThinkBonobo

Respuestas:


35

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.


3
Una respuesta extremadamente perspicaz. Gracias por impartir esta sabiduría.
ThinkBonobo

Aquí hay una charla reciente de Martin Fowler (la tercera) que toca algunos de estos puntos.
Whymarrh

¿Hay alguna manera entre el monolito y los microservicios? Tengo una aplicación monolito multiusuario. Después de un tiempo veo que debo dividir por inquilino. Cada inquilino debe tener su propia instancia de aplicación, pero debe compartir algunos datos y debe ser un lugar único / central. Entonces, puedo crear un servicio separado especialmente para eso. Parece que tendré un par (no tan micro) de aplicaciones / servicios. ¿Suena razonable hacer esto de esa manera?
dariol

@dariol No hay una buena ruta de actualización de monolíticos a microservicios completos a través de un término medio de "cargamos una gran base de código común en todas partes, luego usamos lo que necesitamos de ella". Sin embargo, es razonable hacer esto como un parche temporal para superar una necesidad inmediata. Y luego comience a dividir microservicios reales, hasta que se pueda reemplazar el núcleo. La razón por la que eso es difícil tiene que ver con la gestión de dependencias. Seguirás golpeando, "Solo necesito esto, pero esto depende de eso, depende de eso ... y ahora tengo toda la bola de espagueti".
btilly

Otro enlace de Martin Fowler, sobre este tema: Monolith First
driftcatcher

5

Estoy totalmente de acuerdo con la respuesta de btilly, pero solo quería agregar otro positivo para Microservices, que creo que es una inspiración original detrás de esto.

En un mundo de microservicios, los servicios están alineados con dominios y son administrados por equipos separados (un equipo puede administrar múltiples servicios). Esto significa que cada equipo puede lanzar servicios completamente por separado e independientemente de cualquier otro servicio (suponiendo que las versiones sean correctas, etc.).

Si bien eso puede parecer un beneficio trivial, considere lo contrario en un mundo monolítico. Aquí, donde una parte de la aplicación debe actualizarse con frecuencia, tendrá un impacto en todo el proyecto y en cualquier otro equipo que trabaje en él. Luego deberá introducir la programación, las revisiones, etc., y todo el proceso se ralentizará.

Para su elección, además de considerar sus requisitos de escala, también considere las estructuras de equipo requeridas. Estoy de acuerdo con la recomendación de btilly de que inicie Monolithic y luego identifique más adelante dónde los Microservicios podrían ser beneficiosos, pero tenga en cuenta que la escalabilidad no es el único beneficio.


Eso es verdad. El resto del artículo trata particularmente sobre cómo fomenta la segmentación por 'capacidades comerciales'. Esta es definitivamente una ventaja clave.
ThinkBonobo

2

Trabajé en un lugar que tenía una buena cantidad de fuentes de datos independientes. Los pusieron todos en una única base de datos, pero en diferentes esquemas a los que accedieron los servicios web. La idea era que cada servicio solo pudiera acceder a la cantidad mínima de datos que necesitaban para realizar su trabajo.

No fue una sobrecarga en comparación con una base de datos monolítica, pero supongo que esto se debió principalmente a la naturaleza de los datos que ya estaban en grupos aislados.

Los servicios web se llamaron desde el código del servidor web que generó una página, por lo que se parece mucho a su arquitectura de microservicios, aunque posiblemente no sea tan micro como sugiere la palabra y no se distribuyó, aunque podrían haber sido (tenga en cuenta que un WS sí llamó para obtener datos de un servicio de terceros, por lo que hubo 1 instancia de un servicio de datos distribuido allí). La compañía que hizo esto estaba más interesada en la seguridad que en la escala, sin embargo, estos servicios y los servicios de datos proporcionaron una superficie de ataque más segura ya que una falla explotable en uno no daría acceso completo a todo el sistema.

Roger Sessions en sus excelentes boletines de Objectwatch describió algo similar con su concepto de Software Fortresses (desafortunadamente los boletines ya no están en línea, pero puede comprar su libro).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.