Aquí hay 10 reglas de rendimiento que seguimos cuando usamos Node.js:
1. Evite usar código síncrono
En términos de diseño, Node.js es un solo hilo. Para permitir que un solo hilo maneje muchas solicitudes concurrentes, nunca puede dejar que el hilo espere a operaciones de bloqueo, sincrónico o de larga duración. Una característica distintiva de Node.js es que está diseñado e implementado de arriba a abajo para lograr asíncrono. Esto lo hace muy adecuado para programas de tipo eventos.
Desafortunadamente, todavía existe la posibilidad de que se produzcan llamadas sincrónicas/de bloqueo. Por ejemplo, muchas operaciones del sistema de archivos tienen versiones síncronas y asincrónicas, como WriteFile y WriteFilesync. Incluso si usa el código para controlar el método de sincronización, aún es posible usar la biblioteca de funciones externas que bloquea las llamadas inadvertidamente. Cuando haces esto, el impacto en el rendimiento es enorme.
// bueno: escriba archivos asynchronyfs.writeFile ('Message.txt', 'Hello nodo', function (err) {console.log ("se guarda y el servidor sigue siendo receptivo!");}); // Bad: escriba archivos sincrónicamentefs.writeFilesync ('Message.txt', 'Hello Node'); console.log ("Está guardado, ¡pero acabas de bloquear todas las solicitudes!");Nuestro registro de inicialización incluye involuntariamente una llamada sincrónica para escribir contenido en el disco cuando se implementa. Si no hacemos pruebas de rendimiento, será fácil ignorar este problema. Cuando se usa una instancia de nodo.js en el cuadro de desarrollador como una prueba estándar, esta llamada sincrónica hará que el rendimiento disminuya de miles de solicitudes por segundo a solo unas pocas docenas.
2. Cierre la piscina del enchufe
El cliente HTTP de Node.js usará automáticamente las agrupaciones de sockets: de forma predeterminada, limitará solo 5 enchufes por host. Aunque la reutilización de los enchufes puede causar el aumento de los recursos bajo control, si necesita lidiar con solicitudes concurrentes del mismo host, conducirá a una serie de cuellos de botella. En este caso, es una buena idea aumentar el valor de los maxsockets o cerrar el grupo de enchufes:
// Desactivar la agrupación de socket var http = request ('http'); var options = {.....}; options.agent = false; var req = http.request (opciones)3. No permita que los recursos estáticos usen Node.js
Para recursos estáticos como CSS e imágenes, use servidor web estándar en lugar de Node.js. Por ejemplo, LinkedIn Mobile usa Nginx. También utilizamos Networks de entrega de contenido (CDN), que pueden copiar recursos estáticos en todo el mundo a los servidores. Esto tiene dos beneficios: (1) puede reducir la carga en nuestro servidor nodo.js (2) Los CDN pueden permitir que el contenido estático se entregue en los servidores más cercanos al usuario, reduciendo así el tiempo de espera.
4. Renderizar al cliente
Comparemos rápidamente la diferencia entre la representación del servidor y la representación del cliente. Si usamos Node.js para renderizar en el lado del servidor, para cada solicitud enviaremos una página HTML como la siguiente:
* </div> </body> </html>
Preste atención a observar todo el contenido de esta página, excepto el nombre del usuario, el resto es estático: el contenido sobrecargado por cada usuario y la página son los mismos. Por lo tanto, un enfoque más efectivo es permitir que Node.js devuelva solo el contenido dinámico requerido por la página en forma JSON.
{"Nombre": "John"}
El resto de la página, todas las etiquetas HTML estáticas, se pueden colocar en plantillas de JavaScript (como la plantilla de subscore.js):
< Nombre %>! </div> </body> </html>
La mejora del rendimiento proviene de estos lugares: como dice el tercer punto, las plantillas de JavaScript estáticas se pueden proporcionar en el lado del servidor a través del servidor web (como Nginx), o implementarse con mejores CDN. Además, las plantillas de JavaScript se pueden almacenar en caché en el navegador o almacenarse localmente. Después de cargar todas las páginas iniciales, los únicos datos que deben enviarse al cliente son JSON, que será el más efectivo. Este método puede reducir en gran medida la carga de CPU, IO y Node.js.
5. Use GZIP
Muchos servidores y clientes admiten GZIP para comprimir solicitudes y respuestas. Ya sea que esté respondiendo a un cliente o enviando una solicitud a un servidor remoto, asegúrese de utilizarlo por completo.
6. Paralelización
Intente dejar que todas sus operaciones de bloqueo: envíen solicitudes, llamadas de base de datos y paralelización de acceso al sistema de archivos a servicios remotos. Esto reducirá el tiempo de espera para la operación de bloqueo más lento, en lugar del tiempo de espera para todas las operaciones de bloqueo. Para mantener limpios las devoluciones de llamada y el manejo de errores, usamos paso para controlar el tráfico.
7. Liberalización de sesión
LinkedIn Mobile utiliza el marco Express para administrar los ciclos de solicitud/respuesta. Muchos ejemplos expresos incluyen la siguiente configuración:
app.use (express.session ({secret: "keyboard gat"}));
De manera predeterminada, los datos de la sesión se almacenan en la memoria, lo que agrega una gran sobrecarga al servidor, especialmente a medida que aumenta el número de usuarios. Puede usar un almacén de sesión externo, como MongoDB o Redis, pero cada solicitud dará como resultado la sobrecarga de llamadas remotas para obtener datos de sesión. Cuando sea posible, la mejor opción es almacenar todos los datos sin estado en el lado del servidor. Al liberalizar la sesión al no incluir la configuración expresa anterior, verá un mejor rendimiento.
8. Use módulos binarios
Si es posible, reemplace los módulos JavaScript con módulos binarios. Por ejemplo, cuando nos convertimos de un módulo SHA escrito en JavaScript a una versión compilada de Node.js, vemos un gran salto en el rendimiento:
// use módulos incorporados o binarios crypto = require ('crypto'); var hash = crypto.createhmac ("sha1", clave) .Update (firatureBase) .digest ("base64");9. Reemplace la biblioteca de clientes con JavaScript estándar V8
Muchas bibliotecas de JavaScript se crean para su uso en los navegadores web porque en los entornos de JavaScript, por ejemplo, algunos navegadores admiten funciones como foreach, MAP y reducen, pero algunos navegadores no lo hacen. Por lo tanto, las bibliotecas de clientes generalmente usan mucho código ineficiente para superar las diferencias del navegador. Por otro lado, en Node.js, puede saber exactamente qué métodos JavaScript son efectivos: el motor JavaScript V8 admite Node.js para implementar el ECMAScript especificado en la quinta edición de ECMA-262. Reemplace directamente la biblioteca del cliente con funciones estándar de JavaScript V8, encontrará mejoras significativas de rendimiento.
10. Mantenga su código pequeño y ligero
El uso de un dispositivo móvil hará que el acceso sea lento y latencia alta, lo que nos dice que mantengamos nuestro código pequeño y ligero. La misma filosofía se mantiene para el código del servidor. Ocasionalmente, mire hacia atrás en su decisión y haga preguntas como: "¿Realmente necesitamos este módulo?", "¿Por qué usamos este marco? ¿Vale la pena su uso?", "¿Podemos implementarlo de una manera simple?". El código pequeño y de luz suele ser más eficiente y rápido.
Probar
Trabajamos duro para hacer nuestras aplicaciones móviles rápidamente. Pruébelo en plataformas como aplicaciones de iPhone, aplicaciones de Android y versiones móviles HTML5 para informarnos cómo estamos.