H3 y Node.js se conocen
H3 — HTTP/3 para Node.js con métricas de rendimiento
Las compilaciones nocturnas de uWebSockets.js ahora se envían con compatibilidad experimental con HTTP/3*. ¡Vamos a darle una vuelta!
npm install uNetworking/uWebSockets.js#binaries
Tal como está acostumbrado, los puntos finales del servidor se definen a través de un enrutador de URL fácil de usar con coincidencia de patrones y comodines:
const uWS = require('uWebSockets.js');uWS.H3App({ .key_file_name: './key.pem', .cert_file_name: './cert.pem' }).get('/*', (res, req) => { res.end('H3llo World from Node.js!'); }).listen(9004, (listenSocket) => { if (listenSocket) { console.log('Listening to port 9004!'); } });
Llegar al servidor con quiche-client es fácil (a partir de ahora, necesita una dirección de host local IPv6):
quiche-client --no-verify https://[::1]:9004/> H3llo World from Node.js!
Entonces, ¿qué pasa con el rendimiento?
Comencemos por crear un punto de referencia ejecutando el servidor Node.js HTTP/1.1 más mínimo sin enrutamiento ni cifrado, estresado al 100 % del tiempo de CPU en un solo núcleo:
const http = require('http');const requestListener = function (req, res) { res.end('Hello H1 from (built-in) Node.js!'); }const server = http.createServer(requestListener); server.listen(8080);
En esta máquina en particular, recibimos 18.000 solicitudes por segundo al 100 % del tiempo de CPU, un núcleo. Ahora comparemos eso con H3 de uWebSockets.js.
Al 100 % del tiempo de CPU en un solo núcleo, podemos atender hasta 291.000 solicitudes por segundo, ¡eso está encriptado y enrutado por URL! ¡Eso es una aceleración de 16x!
¿Cómo puede ser mucho más rápido? En parte porque HTTP/3 tiene un paralelismo adecuado de solicitudes (“canalización”). La canalización en HTTP/1.1 se considera rota y deshabilitada por todos los principales navegadores web, pero para completar, habilitaremos la canalización HTTP/1.1 en este punto de referencia y lo ejecutaremos de nuevo.
En igualdad de condiciones, ahora recibimos 28k solicitudes por segundo con el servidor HTTP/1.1 incorporado de Node.js. Esa sigue siendo una diferencia de 10 veces con la compatibilidad con uWebSockets.js HTTP/3. Y recuerda; ¡Los resultados de HTTP/3 están encriptados con TLS 1.3 y enrutados por URL!
¿A dónde vamos desde aquí?
Claramente, los números de rendimiento están por las nubes en comparación con lo que obtienes de la caja con Node.js, y si quieres las funciones de HTTP/3, todavía no tienes suerte con Node.js estándar, ya que simplemente carece de él. enteramente.
uWebSockets.js ahora crea HTTP/3 altamente experimental, pero comenzará a estabilizar este soporte. Un plan aproximado es tener una versión estable dentro de 6 meses, y dentro de 1 mes deberíamos tener una versión con el soporte experimental creado y enviado. Mientras tanto, puede comenzar a migrar sus aplicaciones al ya rápido y estable soporte HTTP/1.1 dentro de uWebSockets.js, alejándose de la contraparte integrada y lenta de Node.js.
Si lo hace, podrá cambiar de uWS.App a uWS.H3App sin cambiar nada de su lógica comercial: uWebSockets.js expone HTTP/3 bajo la misma interfaz que HTTP/1.1.
Muy bien, recuerde que este soporte se encuentra actualmente en la etapa de prueba de concepto y es muy experimental, ¡así que no se sorprenda si le explota en la cara el mes más cercano!
Gracias
[*]: Linux solo en Intel; requiere una dirección de host local IPv6 a partir de ahora. WIP.