CLI · ComandosFilas & streams

Filas & streams

Publicar, inspecionar e drenar mensagens num broker implantado.

eqs mq trabalha contra um broker que você subiu pelo marketplace. Mesmo envelope do eqs db — a api guarda as credenciais, confere a permissão e registra o que rodou — e verbos propositalmente diferentes, porque uma fila não tem linhas para consultar.

eqs mq queues <svc>

O que o broker guarda. Streams no NATS; recusado no AMQP, que não sabe listar.

--jsonJSON puro
shell
eqs mq queues events
eqs mq peek <svc> <alvo>

Lê mensagens sem consumi-las — até onde o broker permitir.

--limit <n>Mensagens antes de truncar (padrão 100)
shell
eqs mq peek orders dead-letter --limit 5
eqs mq consume <svc> <alvo>

Tira as mensagens. Elas não voltam.

--limit <n>Quantas tirar
--jsonJSON puro, para redirecionar para um arquivo
shell
eqs mq consume orders dead-letter --limit 10 --json > drenado.json
eqs mq publish <svc> <alvo> <corpo>

Coloca uma mensagem numa fila ou subject.

shell
eqs mq publish events orders.created '{"id":42}'
eqs mq purge <svc> <alvo>

Descarta tudo o que está ali. Exige data.ddl.

shell
eqs mq purge orders dead-letter

Espiar nem sempre sai de graça

Esta é a parte que vale ler antes de usar em produção.

BrokerO que um peek faz
NATSNada. O JetStream lê a mensagem por sequência e deixa tudo exatamente onde estava. Dá para espiar o mesmo stream o dia inteiro
AMQPMexe. O protocolo não tem olhar sem tirar: cada mensagem é buscada e devolvida, e o RabbitMQ marca como reentregue
No AMQP, cada peek aumenta a contagem de entregas. Qualquer coisa que observe reentrega vê uma tentativa, e um consumidor com limite de retentativas fica uma tentativa mais perto de desistir daquela mensagem. Isso pesa justamente numa dead-letter queue, que é onde as pessoas recorrem ao peek — por isso o comando imprime um aviso quando acontece, em vez de deixar você descobrir pelo consumidor que desistiu.

O resultado sempre informa qual dos dois casos foi o seu, então um script consegue distinguir.

Permissões

VerboExigeQuem tem
queues, peekdata.readReader, Contributor, Owner
consume, publishdata.writeContributor, Owner
purgedata.ddlOwner

purge não é mudança de estrutura, então data.ddl pode parecer o lugar errado. É o certo: essa permissão existe porque editar uma linha e derrubar uma tabela não são o mesmo risco, e esvaziar uma fila de produção é do segundo tipo. Um Contributor consegue drenar a fila mensagem a mensagem com consume, que devolve o que tirou; o que ele não consegue é descartar tudo de uma vez.

O que cada broker não faz

Os dois limites são respondidos pelo nome, e não com um resultado vazio, porque "você não tem filas" é uma resposta errada, não uma resposta nula.

  • AMQP não lista filas. Isso não faz parte do protocolo — está na API HTTP de management do RabbitMQ, noutra porta e com outra credencial. Diga o nome da fila: eqs mq peek <svc> <fila>.
  • NATS precisa de JetStream para tudo menos publish. O NATS puro não guarda nada: uma mensagem sem assinante simplesmente sumiu, então não há o que espiar, drenar ou descartar.

O registro

Toda operação é registrada: quem rodou, contra qual broker, qual fila e quanto tempo levou. O corpo das mensagens não, pelo mesmo motivo dos valores de --param no eqs db — é o conteúdo mais provável de carregar dado pessoal.