En este artículo, profundizaremos en Node.js Streams y comprenderemos cómo ayudan a procesar grandes cantidades de datos de manera eficiente. Las transmisiones proporcionan una forma elegante de manejar grandes conjuntos de datos, como leer archivos grandes, transferir datos a través de la red o procesar información en tiempo real. A diferencia de las operaciones de E/S tradicionales que leen o escriben todos los datos a la vez, los flujos dividen los datos en fragmentos manejables y los procesan pieza por pieza, lo que permite un uso eficiente de la memoria.
En este artículo, cubriremos:
Un flujo en Node.js es un flujo continuo de datos. Las transmisiones son especialmente útiles para manejar tareas vinculadas a E/S, como leer archivos, comunicarse a través de una red o interactuar con bases de datos. En lugar de esperar a que se complete una operación completa, los flujos permiten que los datos se procesen en fragmentos.
Node.js proporciona cuatro tipos de transmisiones:
Exploremos cada tipo de transmisión con ejemplos.
Las secuencias legibles le permiten leer datos pieza por pieza, lo cual es útil para manejar archivos grandes o fuentes de datos en tiempo real.
const fs = require('fs'); // Create a readable stream from a large file const readableStream = fs.createReadStream('largeFile.txt', { encoding: 'utf8', highWaterMark: 16 * 1024 // 16 KB chunk size }); readableStream.on('data', (chunk) => { console.log('New chunk received:', chunk); }); readableStream.on('end', () => { console.log('Reading file completed'); });
Las secuencias de escritura se utilizan para escribir datos de forma incremental en un destino, como un archivo o un socket de red.
const fs = require('fs'); // Create a writable stream to write data to a file const writableStream = fs.createWriteStream('output.txt'); writableStream.write('Hello, world!\n'); writableStream.write('Writing data chunk by chunk.\n'); // End the stream and close the file writableStream.end(() => { console.log('File writing completed'); });
Una transmisión dúplex puede leer y escribir datos. Un ejemplo común es un socket TCP, que puede enviar y recibir datos simultáneamente.
const net = require('net'); // Create a duplex stream (a simple echo server) const server = net.createServer((socket) => { socket.on('data', (data) => { console.log('Received:', data.toString()); // Echo the data back to the client socket.write(`Echo: ${data}`); }); socket.on('end', () => { console.log('Connection closed'); }); }); server.listen(8080, () => { console.log('Server listening on port 8080'); });
Un flujo de transformación es un tipo especial de flujo dúplex que modifica los datos a medida que pasan. Un caso de uso común es la compresión de archivos.
const fs = require('fs'); const zlib = require('zlib'); // Create a readable stream for a file and a writable stream for the output file const readable = fs.createReadStream('input.txt'); const writable = fs.createWriteStream('input.txt.gz'); // Create a transform stream that compresses the file const gzip = zlib.createGzip(); // Pipe the readable stream into the transform stream, then into the writable stream readable.pipe(gzip).pipe(writable); writable.on('finish', () => { console.log('File successfully compressed'); });
Cuando se trata de archivos grandes (por ejemplo, registros o medios), cargar el archivo completo en la memoria es ineficiente y puede causar problemas de rendimiento. Las transmisiones le permiten leer o escribir archivos grandes de forma incremental, lo que reduce la carga de memoria.
Ejemplo:
Las aplicaciones en tiempo real, como servidores de chat o paneles de control en vivo, deben procesar los datos a medida que llegan. Las transmisiones brindan una forma de manejar estos datos de manera eficiente, reduciendo la latencia.
Ejemplo:
La compresión es otro caso de uso común para las transmisiones. En lugar de cargar el archivo completo en la memoria, puedes comprimir datos sobre la marcha usando flujos de transformación.
Ejemplo:
Las transmisiones de Node.js ofrecen una forma flexible y eficiente de manejar grandes cantidades de datos, ya sea que esté leyendo archivos, procesando solicitudes de red o realizando operaciones en tiempo real. Al dividir los datos en fragmentos manejables, los flujos le permiten trabajar con grandes conjuntos de datos sin saturar la memoria del sistema.
En el próximo artículo, exploraremos NGINX y su función en la distribución de contenido estático, el equilibrio de carga y el funcionamiento como proxy inverso en aplicaciones Node.js. También analizaremos cómo integrar SSL y cifrado para mejorar la seguridad.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3