Neste artigo, vamos nos aprofundar nos Streams Node.js e entender como eles ajudam no processamento eficiente de grandes quantidades de dados. Os fluxos fornecem uma maneira elegante de lidar com grandes conjuntos de dados, como leitura de arquivos grandes, transferência de dados pela rede ou processamento de informações em tempo real. Ao contrário das operações de E/S tradicionais que leem ou gravam todos os dados de uma vez, os fluxos dividem os dados em partes gerenciáveis e os processam peça por peça, permitindo o uso eficiente da memória.
Neste artigo, abordaremos:
Um stream em Node.js é um fluxo contínuo de dados. Os fluxos são especialmente úteis para lidar com tarefas vinculadas a E/S, como leitura de arquivos, comunicação em rede ou interação com bancos de dados. Em vez de esperar que uma operação inteira seja concluída, os fluxos permitem que os dados sejam processados em partes.
Node.js fornece quatro tipos de streams:
Vamos explorar cada tipo de stream com exemplos.
Streams legíveis permitem a leitura de dados peça por peça, o que é útil para lidar com arquivos grandes ou fontes de dados em tempo 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'); });
Streams graváveis são usados para gravar dados de forma incremental em um destino, como um arquivo ou soquete de rede.
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'); });
Um stream duplex pode ler e gravar dados. Um exemplo comum é um soquete TCP, que pode enviar e receber dados simultaneamente.
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'); });
Um transform stream é um tipo especial de stream duplex que modifica os dados à medida que eles passam. Um caso de uso comum é a compactação de arquivos.
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'); });
Ao lidar com arquivos grandes (por exemplo, logs ou mídia), carregar o arquivo inteiro na memória é ineficiente e pode causar problemas de desempenho. Os fluxos permitem que você leia ou grave arquivos grandes de forma incremental, reduzindo a carga na memória.
Exemplo:
Aplicativos em tempo real, como servidores de bate-papo ou painéis ao vivo, precisam processar os dados à medida que eles chegam. Os streams fornecem uma maneira de lidar com esses dados de forma eficiente, reduzindo a latência.
Exemplo:
A compactação é outro caso de uso comum para streams. Em vez de carregar o arquivo inteiro na memória, você pode compactar dados dinamicamente usando fluxos de transformação.
Exemplo:
Node.js oferecem uma maneira flexível e eficiente de lidar com grandes quantidades de dados, seja lendo arquivos, processando solicitações de rede ou executando operações em tempo real. Ao dividir os dados em partes gerenciáveis, os fluxos permitem que você trabalhe com grandes conjuntos de dados sem sobrecarregar a memória do sistema.
No próximo artigo, exploraremos NGINX e sua função no fornecimento de conteúdo estático, balanceamento de carga e trabalho como proxy reverso em aplicativos Node.js. Também discutiremos como integrar SSL e criptografia para maior segurança.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3