¿Cuál sería la arquitectura del lado del servidor para manejar 10k usuarios concurrentes en Node.js?

No importa cómo se vea una arquitectura fija para 10k, porque es probable que no pueda predecir con certeza que tendrá 10k usuarios concurrentes, o 5k o 20k. Y que los tendrás constantemente. Tampoco puede predecir qué tamaño de máquina necesitará tener exactamente para las líneas de código que va a ejecutar para esos usuarios concurrentes.

Lo que puede predecir con gran certeza es que tendrá un gran problema para esos usuarios de 5–20k si lo subestima, y ​​que está tirando dinero si lo sobrestima.

Entonces, lo que importa es que puede escalar horizontalmente para admitir más usuarios y volver a escalar para liberar reclamos sobre recursos. Entonces, básicamente, tener, por ejemplo, un número variable de procesos Node.js a medida que el recuento de usuarios (o carga) sube y baja. Puedes buscar en EC2 Autoscaling o Kubernetes. Si no le gusta alojar Kubernetes usted mismo, puede consultar Google Container Engine, que es una versión alojada de esta tecnología. AWS Lambda también podría ser interesante para usted. Asegúrese de revisar Apex Software y serverless.com en ese caso.

Necesitas dar más información.

Si solo son 10000 zócalos inactivos, entonces no se necesitan recursos. Si se trata de renderizar páginas con E / S pesadas, es más.

Proporcione su caso de uso en un comentario aquí e intentaré responder más específicamente.

Si le gusta mi respuesta, vote por favor y sígame para obtener más respuestas a preguntas para las que no sabía que necesitaba una respuesta.


Actualización después de la elaboración en los comentarios:

Su aplicación tiene mucha lectura y los datos escritos se están grabando y no se distribuyen. Esto significa que podemos almacenar mucho en caché.

He dividido la arquitectura en 4 capas distintas. Estas capas se pueden escalar independientemente unas de otras, horizontal y verticalmente.

Capa de entrada :
La primera capa que encuentra el usuario es la capa de entrada. En este caso, un equilibrador de carga que distribuirá las solicitudes recibidas entre los servidores API. Si está utilizando un proveedor de la nube que ofrece un equilibrador de carga administrado, puede dejarlo así. Si está haciendo su propio equilibrador de carga, necesita una conmutación por error. Si ejecuta un repuesto dinámico (copia) del equilibrador de carga principal o tiene una imagen que puede cargar de forma rápida y preferiblemente automática, si falla su equilibrador de carga principal.

Capa de proceso :
Aquí está la lógica. La aplicación debe estar sin estado, por lo que puede agregar y eliminar y procesar a voluntad. Me imagino que una plataforma educativa no necesita funcionar 24/7. Por lo tanto, puede agregar procesos automáticamente durante el día y reducir la escala durante la noche, donde presumiblemente tiene menos usuarios. También durante los exámenes el uso sería mayor.

Tenga en cuenta que digo procesos y no servidores. Cada servidor puede contener tantos procesos node.js como núcleos de CPU. Reorganizar las solicitudes de E / S de un lado a otro no requiere mucha CPU o RAM, pero requiere muchos ciclos de CPU. Entonces tiene sentido extenderlo. Aún así, debe tenerlo extendido en al menos 2 servidores, para protegerse contra fallas de hardware. En esta configuración, considero que 3 servidores con 4 núcleos cada uno deben tener un equilibrio adecuado entre rendimiento y estabilidad. Puedo recomendar PM2 · para administrar los procesos node.js en los servidores individuales.

Capa de caché :
Su aplicación es tan leída con datos que no cambian con frecuencia (al menos los datos que está leyendo la mayoría de los usuarios), que tiene sentido intentar acelerar la entrega de datos. En este ejemplo, he puesto un servidor Redis en la mezcla. Redis es un caché en memoria, lo que significa que es realmente muy rápido.

Por lo tanto, su capa de procesamiento primero debe verificar si el bit de datos ya está en el caché y, si lo está, devolverlo desde allí. De lo contrario, recójalo de MongoDB y póngalo en el caché. Los datos pueden caducar automáticamente, por lo que nunca es anterior a, por ejemplo, 30 segundos, pero eso ahorrará una gran cantidad de solicitudes a MongoDB.

Capa de datos :
Esta es la única capa persistente. Los datos se almacenan en MongoDB y se replican en un clúster. No necesita ser muy grande. El tráfico de escritura es minúsculo y la capa de caché mitiga en gran medida el tráfico de lectura. Pero, de nuevo, debe usar un mínimo de 2 servidores con 2 réplicas, para garantizar una mayor disponibilidad.

Conclusión
Es difícil decir exactamente cuántos recursos necesita. Una vez que se active, debe sobreescalarlo y luego retroceder lentamente hasta encontrar la cantidad correcta de servidores. Para la configuración inicial, recomendaría 1 equilibrador de carga (con respaldo), 3 servidores de procesamiento con 8–12 procesos de servidor, 1 servidor de caché (es rápido reemplazar y llenar de nuevo) y luego 2–3 servidores MongoDB en la capa de datos .

Una nota sobre el desarrollo de Node.js: esta arquitectura supone que la cantidad de lógica en la capa de procesamiento es limitada. Si necesita un procesamiento pesado, como importar grandes conjuntos de datos, debería considerar descargar esta tarea en un servidor separado, que puede procesar los datos e insertarlos en la capa de datos, sin tomar recursos en la API pública.

Espero que esta explicación “breve” le haya dado algunos consejos sobre cómo diseñar su aplicación.

Si desea probar la configuración, puede intentar configurarla en un proveedor de la nube, por ejemplo DigitalOcean: Computación en la nube diseñada para desarrolladores. Registrarse usando ese enlace te da $ 10 de crédito gratis para jugar.

Mira hbakhtiyor / node-frameworks-benchmark

En muchos casos, están alcanzando 10K + con especificaciones simples de computadora portátil.

(cuando los marcos tienen el prefijo au, significa que se usó µWebSockets como implementación HTTP)