Las-Fuerzas-Del-Cielo / Sistema-Anti-Fraude-Electoral

Sistema Open Source para Identificar potenciales fraudes electorales, minimizar su ocurrencia e impacto.
MIT License
1.01k stars 128 forks source link

Trabajar todo como servicio. #157

Open JohnnDev opened 11 months ago

JohnnDev commented 11 months ago

A esto me refiero que todo sea un servicio divido, es decir, un servicio para el usuario, para registrarte loguearte cosas asi, después otro servicio aparte que se encargue de la subida de lo datos, y otro servicio para hacer el analisis, cada servicio, deberia tener un servidor aparte, es como una api en microservicios, las comunicarias por rest, aparte podrian agregar un sistema para controlar las caidas de esos servidores, esto con el objetivo de descentralizar y sea un poco mas dificil de tumbarlo, es mas o menos una propuesta para seguridad, quisiera saber que piensan.

ScorpionConMate commented 11 months ago

Con el poco tiempo que hay, es practicamente imposible montar una estructura de microservicios Es mas facil levantar el monolito que tener que levantar 10k de microservicios y sin saber cual es que esta abajo realmente

mastepanoski commented 11 months ago

Dejo algunas ideas, para lograr aprovechar herramientas disponibles para ahorrar implementar algunos servicios y para escalar:

En cuanto a la seguridad, se podría utilizar Keycloak para manejar la gestión y autorización de usuarios, o bien AWS Cognito en combinación con Cerbos.dev (https://cerbos.dev/ecosystem/cerbos-aws-cognito). De esta manera, se implementaría una solución ya existente sin necesidad de reinventar la rueda.

Para el procesamiento por lotes y tareas, se podría utilizar OptimalBits/Bull junto con Redis (https://github.com/OptimalBits/bull).

Además, se podría iniciar con un Microlito (https://www.paradigmadigital.com/techbiz/microservicios-vs-microlitos-vs-monolitos-ventajas-desventajas/), desarrollado en NestJS+Fastify (https://docs.nestjs.com/techniques/performance) o utilizando HapiJS con plugins (https://hapi.dev/, desarrollado por Walmart para gestionar el volumen de carga en un Black Friday).

En cuanto al autoescalado, si no se utiliza Kubernetes y la posibilidad de escalado horizontal, se podría utilizar PM2 con autoscaling (https://vexell.medium.com/autoscale-node-js-applications-with-pm2-and-pm2-autoscale-module-3129582dc72c). Sin embargo, hay que tener en cuenta que PM2 tiende a reiniciar el servicio si un proceso de NodeJS alcanza el límite de memoria asignado. Creando varias instancias del microlito que contiene todos los módulos sería una forma de gestionar la carga utilizando clustering con PM2, dentro del límite de escalado vertical del servidor (memoria, caché en disco y procesadores).

Finalmente, una arquitectura CQRS sería lo ideal, ya que permite manejar las altas escrituras por un lado y gestionar las lecturas (aunque sea con retraso) por otro.

Espero les sirva esta información para facilitar la implementación del backend y la infraestructura.