H3 y Node.js finalmente se conocen

[vc_row el_class=”blog-info”][vc_column][vc_single_image source=”featured_image” img_size=”full” style=”vc_box_rounded”][vc_empty_space height=”40px”][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text el_class=”font-weight-bold”]

H3 y Node.js se conocen

H3 — HTTP/3 para Node.js con métricas de rendimiento

[/vc_column_text][vc_empty_space height=”40px”][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text]


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.

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row el_class=”social-info”][vc_column width=”1/6″][/vc_column][vc_column width=”2/3″][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text][social_share_button themes=’theme1′][/vc_column_text][/vc_column_inner][vc_column_inner el_class=”youtube-inner-col” width=”1/2″][vc_column_text][likebtn theme=”youtube” lang=”auto” show_like_label=”0″ white_label=”1″ alignment=”right”][/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner el_class=”social-info-inner”][vc_column_inner width=”1/4″][vc_single_image image=”921″][/vc_column_inner][vc_column_inner width=”3/4″][vc_column_text]

Diego Pacheco

Ingeniero en Sitemas, MBA (Babson College). Desarrollador PHP/Java/JavaScript. Fundador & CEO de EpicStudio. Entusiasta de las tecnologías web (JavaScript, Vue, Laravel, AWS, Docker) Viajes, Negocios, Surf y Growth.[/vc_column_text][asvc_list_item icon_fontawesome=”fa fa-calendar-o” icon_size=”14px”]Programar una reunión[/asvc_list_item][/vc_column_inner][/vc_row_inner][/vc_column][vc_column width=”1/6″][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

Recent Post

[/vc_column_text][lvca_posts_carousel posts_query=”size:3|order_by:rand|post_type:post” image_linkable=”true” image_size=”full” taxonomy_chosen=”post_tag” display_title=”true” display_post_date=”true” display_summary=”true” autoplay_speed=”3000″ animation_speed=”300″ display_columns=”3″ scroll_columns=”3″ gutter=”3″ tablet_display_columns=”2″ tablet_scroll_columns=”2″ tablet_gutter=”3″ tablet_width=”800″ mobile_display_columns=”1″ mobile_scroll_columns=”1″ mobile_gutter=”3″ mobile_width=”480″][vc_empty_space height=”20px”][/vc_column][/vc_row]