Plataforma SaaS. Byte4Bit. De monolito a microservicios Lambda asíncronos.

Xell

Un monolito en Node.js y TypeScript migrado a microservicios asíncronos en AWS Lambda, recortando el coste de infraestructura en torno a un 40% mientras se mejoraban las fronteras entre servicios.

Rol
Líder de migración
Cloud
AWS
Coste
~40% menos
Pruebas
Jest
Ver el producto Índice
Fig. 01. Xell en byte4bit.com. El producto no tiene landing propia.

El problema

La plataforma corría como un único despliegue en Node.js y TypeScript que había que aprovisionar para su peor minuto, no para su minuto medio. La mayor parte de esa capacidad estaba parada.

Lideré la migración a microservicios asíncronos en AWS Lambda, recorté el coste de infraestructura en torno a un 40% mientras mejoraba las fronteras entre servicios, y diseñé los modelos de persistencia en DynamoDB y MySQL junto a las suites unitarias, de integración y end to end en Jest.

Node.jsTypeScriptAWS LambdaDynamoDBMySQLJest

En torno a un 40% menos de coste de infraestructura

Pagar por invocación en lugar de por hora aprovisionada eliminó la capacidad ociosa que el monolito tenía que mantener en pie.

Fronteras que sobrevivieron a la mudanza

La descomposición fue una oportunidad para arreglar las fronteras entre servicios en lugar de copiar la forma antigua a más desplegables.

Una suite de pruebas en tres niveles

Las suites unitarias, de integración y end to end en Jest son lo que hizo reversible una migración de este tamaño, servicio a servicio.

Decisiones y el precio que pagué por ellas

Asíncrono por defecto

La mayor parte del trabajo del monolito no necesitaba a nadie esperando. Hacer que el valor por defecto fuera asíncrono es lo que convirtió el aprovisionamiento de pico en coste por invocación.

Trade-off aceptado

La consistencia eventual pasa a ser algo que el producto tiene que expresar, y "ya está hecho" deja de ser el mismo momento que "ya respondió".

Dos almacenes, elegidos por patrón de acceso

DynamoDB para los caminos de acceso por clave de alto volumen, MySQL donde de verdad hacían falta consultas relacionales, en lugar de forzar a un motor a hacer los dos trabajos.

Trade-off aceptado

Dos modelos de persistencia que llevar en la cabeza, y cualquier consulta que quiera cruzarlos hay que diseñarla en vez de escribirla.

Migrar detrás de pruebas, servicio a servicio

La cobertura unitaria, de integración y end to end se escribió antes del corte, así que cada servicio pudo moverse por su cuenta y revertirse por su cuenta.

Trade-off aceptado

La migración tardó más de lo que habría tardado una reescritura, y durante un tiempo hubo que mantener funcionando las dos formas.