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?
c#
.net
microservices
codelove
fuente
fuente
Respuestas:
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.
fuente
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.
fuente