H3 y Node.js finalmente se conocen

h3

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!

h3

¿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.

Recent Post