SANAKA
Ākāśa sentada diante de painéis estelares com alertas e retratos, envolvida por fios luminosos de energia.
← Voltar ao catálogo da Matrix

Matrix on-line · Laboratório 04

As entregas de Ākāśa

Ajude Ākāśa a escolher a próxima encomenda. Experimente a ordem de retirada e depois decida se uma entrega chegou ou precisa tentar de novo.

Experimentar

Acompanhe uma encomenda por vez

As entregas existem apenas nesta página. Você controla cada passagem.

Etapa 1 de 3

Quem chegou primeiro

As encomendas chegaram na ordem mostrada. Retire a próxima e veja qual sai primeiro.

Encomendas aguardando

  1. Posição 1volume-01Próxima a sair
  2. Posição 2volume-02
  3. Posição 3volume-03

Retira a primeira que ainda espera. A sequência registrada abaixo mostra a ordem de saída.

O que aconteceu?

Há três encomendas aguardando. A próxima a sair está destacada.

Ver explicação técnica e código desta passagem

A etapa usa Queue/FIFO ou Stack/LIFO para escolher a próxima posição. As duas armazenam volumes num Array.

TypeScriptdelivery-queue.ts
Selecionar FIFO ou LIFO
export function startDelivery(state: DeliveryState): StudyStep<DeliveryState> {
  if (state.processing !== null) {
    return step(state, 'busy');
  }
  if (state.head >= state.entries.length) {
    return step(state, 'empty');
  }
  const fifo = state.discipline === 'queue';
  const parcel = state.entries[fifo ? state.head : state.entries.length - 1];
  return step(
    {
      ...state,
      // FIFO não chama shift: avança o índice. O prefixo permanece até o reinício.
      head: fifo ? state.head + 1 : state.head,
      entries: fifo ? state.entries : state.entries.slice(0, -1),
      processing: { ...parcel, attempts: parcel.attempts + 1 },
    },
    fifo ? 'startFifo' : 'startLifo',
    { label: parcel.label, attempt: parcel.attempts + 1 },
  );
}
Inspecionar os registros antes e depois

Estes registros mostram a simulação em cada momento. Rever uma passagem muda o estado observado; agir a partir dela substitui o caminho que vinha depois.

Estado anterior

{
  "discipline": "queue",
  "entries": [
    {
      "id": 1,
      "label": "volume-01",
      "attempts": 0
    },
    {
      "id": 2,
      "label": "volume-02",
      "attempts": 0
    },
    {
      "id": 3,
      "label": "volume-03",
      "attempts": 0
    }
  ],
  "head": 0,
  "processing": null,
  "delivered": [],
  "deadLetters": [],
  "nextId": 4
}

Estado observado

{
  "discipline": "queue",
  "entries": [
    {
      "id": 1,
      "label": "volume-01",
      "attempts": 0
    },
    {
      "id": 2,
      "label": "volume-02",
      "attempts": 0
    },
    {
      "id": 3,
      "label": "volume-03",
      "attempts": 0
    }
  ],
  "head": 0,
  "processing": null,
  "delivered": [],
  "deadLetters": [],
  "nextId": 4
}
Adicionar uma encomenda (opcional)

Coloca o volume no final sem interromper uma entrega que já está a caminho.

Retire uma encomenda para observar a ordem da fila.

Código em movimento

Se quiser ir além

Trecho 1 de 5
Consultar as funções e os arquivos

Funções completas deste laboratório, extraídas dos arquivos reais. A explicação da ação atual está junto do experimento.

TypeScriptdelivery-queue.ts
Selecionar FIFO ou LIFO
export function startDelivery(state: DeliveryState): StudyStep<DeliveryState> {
  if (state.processing !== null) {
    return step(state, 'busy');
  }
  if (state.head >= state.entries.length) {
    return step(state, 'empty');
  }
  const fifo = state.discipline === 'queue';
  const parcel = state.entries[fifo ? state.head : state.entries.length - 1];
  return step(
    {
      ...state,
      // FIFO não chama shift: avança o índice. O prefixo permanece até o reinício.
      head: fifo ? state.head + 1 : state.head,
      entries: fifo ? state.entries : state.entries.slice(0, -1),
      processing: { ...parcel, attempts: parcel.attempts + 1 },
    },
    fifo ? 'startFifo' : 'startLifo',
    { label: parcel.label, attempt: parcel.attempts + 1 },
  );
}
Selecionar FIFO ou LIFO

A disciplina escolhe qual posição será retirada. processing conserva a encomenda entre retirada e confirmação; head avança apenas no modo fila.

Onde estudar estes arquivos
Rever os conceitos
Fila e pilha: a mesma entrada, outra ordem

Em palavras simples

Numa fila de atendimento, quem chegou primeiro sai primeiro. Numa pilha de livros, o último colocado costuma ser o primeiro retirado.

O conceito técnico

Queue usa FIFO: First In, First Out. Stack usa LIFO: Last In, First Out. São disciplinas de remoção, não sinônimos de Array. Um array pode servir de armazenamento para ambas.

Remover do início não exige sempre deslocar tudo

Em palavras simples

Você pode empurrar todos os livros para ocupar o espaço vazio ou apenas mover um marcador que diz onde a fila começa.

O conceito técnico

No modelo de array denso simples, shift pode exigir trabalho linear; esvaziar a fila assim tem custo O(n²). Avançar um índice faz n leituras para esvaziar, O(n). Push/pop costumam ter custo amortizado constante em arrays dinâmicos, mas motores têm estratégias próprias. Um índice inicial também exige planejamento para recuperar memória.

Uma fila em memória ainda não é mensageria

Em palavras simples

Receber uma encomenda, tentar entregá-la e confirmar o destino são acontecimentos diferentes. O pacote pode sair da fila e continuar sob responsabilidade de quem o transporta.

O conceito técnico

Produtor cria mensagens; broker organiza sua disponibilização; consumidor processa; acknowledgement confirma. Retry define uma nova tentativa; dead-letter separa mensagens que esgotaram a política. Persistência, redelivery e deduplicação exigem implementação própria e variam por plataforma.

Testar exemplos

Confira o que aprendeu

Abrir exemplos de verificação

Este botão roda exemplos prontos e compara os resultados. Ele não altera sua experiência.

Explorar

Continue explorando

O que acontece depois da última entrega?

Processe todos os volumes. Uma nova retirada informa fila vazia. No modo mensageria, confirme cada processamento antes de retirar o próximo.

Duas etiquetas iguais representam uma mensagem só?

Não. Adicione duas etiquetas iguais: cada nova encomenda recebe um id próprio. Uma repetição de entrega preserva o id; uma nova entrada cria outro. Deduplicação de negócio não está implementada.

Como provocar a fila de falhas?

Ative mensageria simulada, processe e falhe. O item volta ao final. Processe os outros até ele voltar ao início e falhe na segunda tentativa. Ele aparecerá em deadLetters com o mesmo id.

Como permitir três tentativas em vez de duas?

Mude MAX_DELIVERY_ATTEMPTS em delivery-queue.ts e ajuste os testes de retry/dead-letter. A interface lê a mesma constante. Depois sincronize os recortes para manter a explicação ligada ao código real.