El servicio de reconocimiento facial Look-A-Like ha servido a miles de usuarios al mismo tiempo.Desarrollar en NodeJS como un hobby es un placer, pero cuando se trata de producción para muchos usuarios, hay un par de cosas que debes saber para evitar una respuesta larga y problemas técnicos.
Como parte de nuestro trabajo en MyHeritage, desarrollamos el servicio doppelgänger para Eurovisión 2019, con el que, al cargar una selfie, puede descubrir cuáles de los concursantes son más similares a usted.
Además de la lógica del reconocimiento facial, la aplicación tenía un requisito extremadamente claro: tenía que servir a decenas de miles de usuarios simultáneos, porque millones de personas en todo el mundo ven Eurovisión.
Muy rápidamente, nos dimos cuenta de que el equilibrador de carga frente a la aplicación configurada con Auto Scaling no es suficiente para la tolerancia a fallas. Lo siguiente nos ayudó mucho:
- Espere lo mejor, pero prepárese para lo peor: mida cuántos usuarios concurrentes podrán servir su aplicación en el tiempo X (en una instancia). Por ejemplo, en nuestro caso, las pruebas mostraron que podemos servir a 200 usuarios concurrentes en cada instancia de EC2 durante 10 segundos, por lo que cuando descubrimos que deberíamos servir a 10,000 usuarios concurrentes, solo teníamos que preparar 50 servidores para el equilibrador. Para la prueba, utilizamos una excelente herramienta llamada JMeter .
Y este tutorial ayudó mucho en la preparación de las mediciones. - Evite bloqueos: las operaciones de bloqueo (como
fs.readSync
) son atractivas porque el código se ve más limpio, pero literalmente matan el rendimiento. En su lugar, use operaciones async
/ en await
, porque durante la operación asíncrona, la CPU estará disponible para otras tareas (consulte Bucle de eventos ).
Antes: const res = fs.readSync('file.txt');
const res = fs.readSync('file.txt');
Después: const res = await fs.readAsync('file.txt');
- Aumente el límite de memoria: el
Node
está configurado de forma predeterminada en un límite de 1 GB. Si el servidor tiene acceso a, digamos, 4 GB específicamente para su aplicación, tendrá que establecer manualmente el límite máximo de memoria utilizando la CLI con el siguiente indicador: --max-old-space-size
--max-old-space-size
Ejemplo: node --max-old-space-size=4096 server.js
- Asegúrese de utilizar todos los núcleos del procesador: de forma predeterminada,
Node
ejecuta en el mismo subproceso. Si no ha configurado específicamente una configuración que ejecute varios subprocesos, ahorre dinero eligiendo un servidor con 1 núcleo. - Reduzca el número de llamadas a la aplicación: configure HTTPS forzado y todos los redireccionamientos lo más alto posible (por ejemplo, a nivel de proxy). Esto permitirá que la aplicación no se distraiga con lo superfluo y, por lo tanto, sea más accesible para solicitudes que sean realmente importantes.
- Manejo de errores: use el registro, por ejemplo Logz.io/AWS CloudWatch para rastrear errores que pueden conducir a fallas en la aplicación. NO reporte servicios como Slack sobre todo, porque los mensajes generalmente van en masa y pueden obstruir fácilmente un canal. Utilizamos una excelente biblioteca llamada Winston para iniciar sesión en NodeJS.
En nuestro caso, estos consejos condujeron a una mejora de diez veces en la productividad y ayudaron a mantener limpio el entorno de producción incluso cuando tenía que atender a miles de usuarios al mismo tiempo.
Gracias por leer