Voltar
Estruturas de DadosJavaScriptArtigo · 7 de abr. de 2024 · 8 min

jonathanjuliani

Implementando Fila (Queue) com NodeJS e Javascript

Fila FIFO em JavaScript e Node.js: implementação simples, padrões de uso e onde filas aparecem em sistemas reais no dia a dia.

Ilustração do post sobre filas (queue) com Node.js e JavaScript

Job queue, fila de mensagens, atendimento por ordem de chegada — tudo FIFO: primeiro a entrar, primeiro a sair. Array com push + shift funciona, mas tem pegadinha de performance.

O que você vai aprender:

  • enqueue / dequeue com array
  • Por que shift() pode doer em fila grande
  • Quando linked list ajuda na fila
  • BFS (ep. 14) como fila na prática

Pré-requisitos: pilhas (ep. 4) e linked list (ep. 3).


Queue (fila): FIFO com array na prática

Eficiência no Gerenciamento Sequencial de Dados

Filas, ou queues, são uma estrutura de dados essencial que opera sob o princípio First In, First Out (FIFO), onde o primeiro elemento adicionado é o primeiro a ser removido. Então, qual é a sacada aqui? Literalmente uma fila, quem chegou primeiro vai ser executado/processado primeiro.

implementando-fila-com-nodejs-e-javascript

Fundamentos e Implementação

Uma fila é uma coleção ordenada de itens onde a adição de novos itens ocorre no final da fila, e a remoção dos existentes, no início (quando a gente fala remoção aqui, não queremos dizer apenas remoção, mas pode ser remoção, processamento, ordem de leitura, etc).

Assim como as pilhas, as filas podem ser implementadas utilizando arrays em NodeJS/JavaScript. Uma implementação básica incluiria métodos para enfileirar (enqueue), desenfileirar (dequeue) e inspecionar o primeiro elemento da fila:

código
class Queue {
  constructor() {
    this.items = []
  }
 
  // Adiciona um elemento ao final da fila
  enqueue(element) {
    this.items.push(element)
  }
 
  // Remove e retorna o primeiro elemento da fila
  dequeue() {
    if (this.isEmpty()) return 'Underflow' // Fila vazia
    return this.items.shift()
  }
 
  // Retorna o primeiro elemento sem removê-lo
  front() {
    if (this.isEmpty()) return 'No elements in Queue'
    return this.items[0]
  }
 
  // Verifica se a fila está vazia
  isEmpty() {
    return this.items.length === 0
  }
 
  // Imprime a fila
  printQueue() {
    let str = ''
    for (let i = 0; i < this.items.length; i++) str += this.items[i] + ' '
    console.log(str)
  }
}

Onde raios Usamos Filas?

Controle de Tarefas

Filas são ideais para controle de tarefas em sistemas operacionais, onde operações são agendadas e processadas na ordem de chegada, garantindo uma execução justa e sequencial.

Gerenciamento de Eventos

Em aplicações que respondem a eventos externos, como interfaces gráficas ou servidores web, filas ajudam a gerenciar eventos de forma organizada, processando-os um a um.


Edge cases: shift() é O(n)

Cada dequeue com shift() move todos os elementos do array. Fila com milhões de itens vira gargalo — use índice head, linked list ou fila da lib.

"Tá Jon, por que não pop do começo?"

pop(0) também é O(n). FIFO no array pede remover do índice 0 — por isso linked list ou cursor.


TL;DR — Fila

AbordagemdequeueObservação
push + shiftO(n)Simples, ok pra fila pequena
índice headO(1)Array sem shift
linked listO(1)Ponteiros head/tail

Próximos passos


Antes de fechar

Onde você usou fila de verdade — Bull, SQS, ou array caseiro? Comenta o gotcha que mais te pegou.

Inscreva-se no Ledger da Engenharia

Receba notas de arquitetura e performance na sua caixa de entrada. Mesma lista do convite—inscreva-se aqui quando quiser.

Sem spam. Sem APIs de terceiros. Apenas eu enviando updates.

O Ledger da Engenharia

Transmissoes quinzenais sobre arquitetura, performance e engenharia aplicada. Inscreva-se a partir de qualquer artigo—sem spam.