¿Cuáles son las consideraciones importantes al cambiar de arquitectura monolítica a microservicios en .NET? [cerrado]

8

Estamos contemplando la división progresiva de nuestros monstruos monolíticos en arquitectura basada en microservicios. Tenemos 5 equipos, cada equipo con 2-3 desarrolladores de C #, al menos 1 desarrollador de bases de datos y 2 ingenieros de control de calidad. Además del enorme cambio de cultura y paradigma que va de una arquitectura monolítica a microservicios, también existen desafíos técnicos. Me gustaría pedirle a la comunidad un poco de sabiduría y consejos para que podamos evitar cometer los mismos errores.

¿Hay buenos ejemplos de la industria en los que los microservicios basados ​​en .NET se hayan utilizado con éxito en un sistema de producción? ¿Cuál fue la estrategia para lo siguiente?

  • Org : ¿cómo organizó las soluciones / proyectos .NET?
  • Planificación del desarrollo : en términos de planificación del desarrollo, ¿cómo dividió el trabajo entre los equipos? ¿Cuál fue la estrategia general para garantizar que el cumplimiento del contrato entre microservicios se negoció entre los equipos?
  • Equilibrio de carga / enrutamiento / puerta de enlace API : ¿cuál fue la estrategia para el equilibrio de carga, la redundancia y el escalado? ¿Acabas de utilizar una arquitectura asíncrona completa y utilizaste una cola para la comunicación de microservicios o lo hiciste de igual a igual a través de una puerta de enlace API / equilibrador de carga? ¿Y por qué?
  • Automatización de pruebas : cómo manejó la automatización de pruebas. Esto, junto con la integración continua, parece absolutamente necesario para la arquitectura de microservicios. ¿Cómo lo hiciste?
  • Implementación : ¿cómo se implementa? ¿Una VM / microservicio o un contenedor / microservicio o algo completamente diferente? ¿Cómo manejó el hecho de que ahora tiene decenas de bases de datos, si no más, considerando que cada microservicio tendría su almacén de datos, qué le hizo eso a su infraestructura y cómo lo manejaron sus DBA?
  • Infraestructura : cómo se amplió su infraestructura con esta arquitectura. ¿Fue muy hablador y tuviste que afinarlo o la red lo manejó sin problemas? ¿Son autohospedados o en la nube?
  • Monitoreo : ¿cuál es su estrategia de monitoreo? ¿Cómo estás controlando decenas si no cientos de microservicios? ¿Es principalmente a través del registro y la supervisión central?
codelove
fuente
3
La mayoría de estos puntos de la bala podría hacer una pregunta razonable - sino como una pregunta, esto es mucho demasiado amplia.
Philip Kendall
1
Con 5 equipos, cada equipo con 2-3 desarrolladores de C #, todos trabajando en el mismo producto, tendrá problemas mucho más grandes que esos aspectos técnicos. Comience con un equipo y una parte de la aplicación, e intente hacer un microservicio que pueda usarse junto con la aplicación restante. Entonces puede responder a sus preguntas anteriores de esa experiencia.
Doc Brown

Respuestas:

9

He trabajado en varios proyectos de microservicios. Inevitablemente, las empresas han tomado la ruta porque su gran enfoque de DB no puede escalar más. Aquí están mis experiencias / recomendaciones.

Org. Una solución por microservicio. paquetes nuget para bibliotecas compartidas

Desarrollo. Los equipos más grandes 5-6 desarrollan un área de funcionalidad a la vez. Refactorizar en un servicio interconectado. Reemplace el servicio en memoria con un cliente para el microservicio.

Pruebas. pruebas de integración utilizando datos de entrada / salida reales. Desea poder dispararlos contra cualquier instancia en ejecución para verificar que estén activos y correctos, instancias locales, entornos de prueba / uso y en instancias de memoria para pruebas unitarias. Asegúrese de que puede probar la versión de la instancia a través de una interfaz de comprobación de salud o similar

Escalada. Basado en la cola es lo mejor, ya que puede manejar procesos distribuidos de varias etapas. Rabbit MQ, Zero MQ, MSMQ, etc. Pero los servicios REST con carga equilibrada están bien para llamadas de estilo rpc y pueden ser un punto de partida fácil.

Despliegue. Pulpo. proyectos db, auto creación de no-sql.dbs como Mongo. Aunque creo que vas por la ruta incorrecta si tienes múltiples dbs. En su lugar, tenga mensajes pesados ​​que contengan los datos que necesita para el proceso y algunos dbs más grandes para el almacenamiento de datos ocultos detrás de sus propias API.

No hay DBA! Si tiene un DBA que escribe sql, lo está haciendo mal.

Infraestructura. No hay problemas. Leer de una cola. Hacer el proceso. Escribe en una cola. Puede escapar con más de una instancia por caja, incluso en micro instancias en la nube para servicios pequeños o poco frecuentes

Supervisión. Interfaces de comprobación de estado para todos los servicios llamados regularmente por software de monitoreo y hasta en el tablero grande.

La conmutación por error automática y la recuperación son importantes, las instancias deben girar cuando sea necesario y no tener estado, por lo que un bloqueo no mantiene el servicio fuera de línea.

El principal problema no es tanto la caída de los servicios como la naturaleza misma de los microservicios los hace robustos a este respecto. Es cómo maneja los mensajes que no pueden / han sido procesados.

Use logstash o similar para realizar un seguimiento del flujo de mensajes y averiguar dónde y cuáles son los problemas. Asegúrese de que puede volver a ejecutar mensajes fallidos para que un proceso fijo pueda continuar donde lo dejó.

Nota final. versión todo, dlls, nugets, datos, interfaces. Con múltiples instancias de múltiples servicios y mensajes históricos flotando, puede ser una causa importante de problemas.

Ewan
fuente
1
"Si tienes un DBA que escribe sql, lo estás haciendo mal". : ¿por qué? Quiero decir, aparte de las cosas ágiles que todos deberían poder hacer todo, ¿qué evitaría tener un DBA dedicado en un entorno de microservicios en comparación con uno que no sea de microservicios?
Arseni Mourzenko
Hmm difícil de explicar. Por lo general, lo que veo es organizaciones con grandes sql dbs heredados llenos de sprocs de los que intentan escapar. Llegaron a este estado debido a un enfoque centrado en DataBase y la opinión del DBA de que hacerlo en la base de datos es más rápido. Esto es exactamente lo contrario de lo que la arquitectura de microservicios estoy tratando de hacer. Entonces, la presencia de un DBA indica que no han escapado de la vieja forma de pensar
Ewan
Eso ni siquiera está cerca del verdadero @Ewan. Nuestro DBA seguro como mierda no quiere reglas comerciales en nuestra base de datos. Le preocupa más poder migrar a diferentes servidores y versiones más nuevas que escribir consultas comerciales. Los DBA hacen mucho más que escribir SQL si son buenos en eso. Esta actitud tuya sobre los DBA muestra que no has escapado de la forma de pensar .
RubberDuck
2
@RubberDuck: estás hablando aquí sobre el lado del administrador del sistema de un DBA. Ewan, por otro lado, estaba hablando específicamente sobre las tareas de escritura SQL de un DBA, mientras que imaginé a los DBA como alguien que usa su amplio conocimiento de las bases de datos para ayudar a los desarrolladores a optimizar sus consultas, asesorar sobre los diferentes riesgos y, en general , les facilita la vida frente a los aspectos complejos de las bases de datos.
Arseni Mourzenko
@RubberDuck, sí, su "código de olor" basado en la información limitada en el OP. definitivamente quieres un DBA en el rol de operaciones haciendo las cosas difíciles. a menos que, por supuesto, se mueve a una base de datos de nube
Ewan
1

Durante los últimos 2 años hemos dividido un monolito en microservicios, así que aquí están algunas de las cosas que estamos haciendo.

Organización : cada servicio será una solución en sí mismo, no habrá proyectos comunes con ningún otro servicio. Y terminamos los contratos como una solución separada en sí misma, donde cada versión es un paquete .nuget.

Desarrollo : cada equipo estaba trabajando en una parte de la aplicación, para cada nuevo servicio comenzamos con la creación del contrato y luego separamos el servicio, pero aún lo mantenemos como parte de la aplicación / solución principal (por lo que todavía no hay llamadas HTTP). Y en un paso futuro desarmaríamos este servicio totalmente.

Enrutamiento : todos nuestros servicios están detrás de un equilibrador de carga y cada servicio se implementa en unos pocos vms. Estamos compartiendo la misma VM para múltiples servicios. Ir con un vm por servicio me pareció una pérdida de recursos, porque los servicios son pequeños, mientras que un vm de Windows necesita alrededor de 2G para funcionar bien. Algunos servicios que no están relacionados con la interacción del usuario (como el envío de correos electrónicos / notificaciones) funcionan con colas.

Pruebas : Inicialmente pensamos que esa unidad prueba el servicio y prueba la compatibilidad de los contratos entre diferentes versiones de los clientes y el servicio con Pact.Net sería suficiente. Pero tuvimos problemas cuando no se implementó una nueva versión de un servicio y trabajamos con la anterior. Todas las pruebas pasaron, pero toda la plataforma no funcionaba bien. Así que agregamos algunas pruebas de alto nivel (integración) en los flujos principales.

Implementación : toda la plataforma está instalada en un par de vms, estamos utilizando una combinación de TFS para compilar, AWS S3 para artefactos, Ansible para la creación, implementación y configuración de vm. Ansible juega un papel importante aquí, no tiene agentes y utiliza la comunicación remota de PowerShell para conectarse a Windows. Dejamos de usar la transformación xml de web.config y pasamos a las plantillas de Ansible, para que podamos tener toda la configuración en los archivos de Ansible. Y lo bueno es que es gratis y de código abierto, en comparación con el pulpo. Se usan vms completamente nuevos para las nuevas versiones, actualizamos los servicios solo cuando tenemos que implementar arreglos.

Escalado : en dicha implementación solo puede escalar los vms y no el servicio en sí. Entonces, controle su rendimiento (CPU, RAM), la cantidad de solicitudes que recibe o incluso el tiempo (como en el fin de semana hay menos tráfico), inicie y detenga los nuevos vms

Monitoreo : estamos en AWS y tenemos CloudWatch para alertas de series temporales, pero estamos planeando ir a Grafana y Prometheus (un paso más cerca para ir a Docker, ahora con Server 2016). En el registro estamos usando Graylog (que está usando ElastiSearch detrás). Fue fácil adoptarlo, porque antes estábamos usando Log4Net con agregadores de archivos y hay un complemento especialmente para Graylog. Puede crear muchas alertas basadas en él, nos dimos cuenta de que en realidad es un proceso continuo.

Liviu Costea
fuente