Logo

dev-resources.site

for different kinds of informations.

A Few About: Streams NodeJs (PT-BR)

Published at
9/27/2023
Categories
node
learning
programming
streams
Author
yestorootkit
Categories
4 categories in total
node
open
learning
open
programming
open
streams
open
Author
12 person written this
yestorootkit
open
A Few About: Streams NodeJs (PT-BR)

Streams o conceito utilizado por Youtube, Netflix, Spotify entre outros para receber e enviar porções de dados grandes de/para usuários.

Uma ideia incompreendida e de difícil aplicabilidade. Mas, ao compreender, como tudo, é possível ver que não é nenhum “bicho de 7 cabeças”

No NodeJS é possível utilizar Streams, aliás foi a plataforma que veio para auxiliar os desenvolvedores a trabalhar com esse conceito, já que antigamente muitas ferramentas não trabalhavam e as que trabalhavam tinha um complexidade ainda maior.

Mas o que são Streams?

É uma coleção de dados, assim como arrays e strings. A diferença entre arrays e strings é que esses dados não pode ser disponibilizados todos de uma vez e não precisam ficar todos alocados na memória de uma só vez, o que traz a possibilidade de poder trabalhar com grandes coleções de dados, seja de fonte interna ou externa.

Há dois conjuntos de Streams:

  • Streams de Leitura (Requisição de dados ao servidor);
  • Streams de Escrita (Envio de dados ao cliente);
  • Streams Duplex (Leitura e Escrita ao mesmo tempo)

No NodeJS Stream é uma biblioteca nativa, onde possui objetos nativos para podermos trabalhar. Objetos como TCP Sockets, zlib e crypto streams.

Assim como na biblioteca padrão HTTP tem stdio (stdin, stdout, stderr), também tem na biblioteca Stream.

Resumindo a funcionalidade…

Em resumo o Stream vai pegar um arquivo grande (Ex.: 2GB) e vai enviar/receber ele em partes, em torno de 25mb cada parte e no final vai reconstruir ele através de referencias para o elemento corrente, criadas antes de ser particionado.

É uma forma de encapsular esta referência de forma que haja a possibilidade de percorrer todos os elementos da coleção de dados.

Um exemplo prático

Criando um grande arquivo de String:

const fs = require(fs);

const file = fs.createWriteStream(./bigFile.txt);

for (let i = 0; i  1e6; i++) {

file.write('Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n');

}

file.end();
Enter fullscreen mode Exit fullscreen mode

Foi utilizado para gravar um Stream de escrita. Onde foi gravado 1 milhão de linhas (1e6) com um loop for .

O módulo fs pode ser utilizado para ler e gravar arquivos usando uma interface de Stream.

Se criarmos um servidor padrão para consumir esse arquivo, o consumo de memória vai elevar consideravelmente. Podemos testar da seguinte forma:

const fs = require('fs');
const server = require('http').createServer();

server.on('request', (req, res) => {
    fs.readFile('./bigFile.txt', (err, data) => {
    if (err) throw err;

    res.end(data);
    });
});

server.listen(8000);
Enter fullscreen mode Exit fullscreen mode

Quando executar o código e fazer uma requisição solicitando o arquivo, será enviado, utilizando um método assíncrono fs.readFile .

Porém ao fazer essa solicitação, como disse anteriormente, o consumo de memória vai elevar significativamente.

Agora vamos codar a mesma coisa porém utilizando o método createReadStream do módulo fs .

const fs = require('fs');
const server = require('http').createServer();

server.on('request', (req, res) => {
    const src = fs.createReadStream('./bigFile.txt');
    src.pipe(res);
});

server.listen(8000);
Enter fullscreen mode Exit fullscreen mode

Agora ao executar verá que o consumo de memória será baixo, pois como explicado anteriormente, o arquivo foi fragmento em partes.

Atualização: Disponível em meu Github um repositório onde trabalho um pouco com Stream e HTTP no Nodejs. https://github.com/yestorootkit/Streams-Nodejs

Bom, espero ter conseguido explicar um pouco sobre Stream e mostrar um pouco do funcionamento dele no NodeJS.

Agradeço a leitura!

streams Article's
30 articles in total
Favicon
How does Optional.ifPresent() differ from Optional.orElse()?
Favicon
Beyond the Basics: Mastering Streams in Node.JS
Favicon
The streaming bridges — A Kafka, RabbitMQ, MQTT and CoAP example
Favicon
Java Streams | What is the difference between sorted() and distinct() in streams?
Favicon
How to handle large file uploads in SvelteKit using streams
Favicon
Execução preguiçosa com Lambdas
Favicon
Руководство по Java 8 Stream API
Favicon
In Java how to create a custom ArrayList that doesn't allow duplicate? #Interview Question
Favicon
Why Set Doesn't Allow Duplicates in Java
Favicon
Optional Class in Java and its methods
Favicon
A Few About: Streams NodeJs (PT-BR)
Favicon
File reading in python
Favicon
Asynchronous Streams in C#: Effortless Async Data Processing
Favicon
Working with streams in Node.js
Favicon
Migrating to Phoenix Liveview Streams
Favicon
What is Java Stream and why does it exist?
Favicon
-
Favicon
Streams em Node.js para iniciantes (guia básico)
Favicon
From a data stream to the data warehouse
Favicon
Gentle Intro to Node Streams
Favicon
The Java `.boxed()` Method
Favicon
Request and Response Stream - Observations
Favicon
Getting a near-real-time view of a DynamoDB stream with Python
Favicon
Exploring Java Streams
Favicon
Service Worker Side Rendering (SWSR)
Favicon
Listening to payments (real-time) on your Stellar wallet
Favicon
Supporting Cross Node Interactive Queries In Kafka Streams
Favicon
Summing Java Streams Api
Favicon
Handling Slow Servers in NodeJS
Favicon
Java 8 Non ce n’est pas que les streams

Featured ones: