Pular para o conteúdo

apps/infrastructure/zeromq

177 · Infraestrutura em Docker · ≈ 7 min de estudo

ZeroMQ — distribuição de cotações sem broker

ZeroMQ não é um servidor: é uma biblioteca de sockets linkada dentro de cada processo. Não existe broker para subir, configurar ou manter de pé — os peers falam direto entre si pelo protocolo ZMTP. Use quando perder uma mensagem é aceitável e o que importa é latência e nenhum ponto central de falha, como num feed de cotações.

passos
6
arquivos
8
testes
0
tecnologias
4
Infraestrutura realTypeScriptBunZeroMQDocker
Baixar cartão

Cenário

A mesa de câmbio publica cotações de USD/BRL, EUR/BRL e GBP/BRL várias vezes por segundo. A mesa de trading só opera dólar; a de liquidação só precisa de euro. Sem broker no meio, o feed não sabe que as mesas existem: publica no próprio socket e segue. Cada mesa decide o que recebe, e a que conecta atrasada simplesmente começa do tick atual — para cotação, o próximo tick substitui o perdido.

Planta

Fluxo
3/3
container zeromq-fx-feedhostFeed de câmbioPUB bind tcp://*:5555Mesa de tradingSUB subscribe USD/BRLMesa de liquidaçãoSUB subscribe EUR/BRLdescartado na origemUSD/BRLEUR/BRLGBP/BRL:ninguém assinou
3

3 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Distribuição de cotações de câmbio sem broker

Esconde cada passo: lembre antes de tocar para revelar.

Vocabulário compartilhado

  1. 01

    O feed abre um socket PUB e faz bind: o lado estável fica parado enquanto as mesas vêm e vão

  2. 02

    Cada mesa abre um SUB, faz connect e assina por prefixo; sem nenhuma assinatura não recebe nada

  3. 03

    A cotação vai em dois frames, [par, json]: o filtro do ZeroMQ casa o prefixo de bytes do primeiro frame

  4. 04

    Um par que ninguém assina morre na origem, sem fila acumulando; acima do high-water mark, o PUB descarta para aquele peer

  5. 05

    Slow joinerO que foi publicado antes da conexão nunca chega; o sequence de cada cotação mostra o que a mesa perdeu

  6. 06

    Todo socket nasce com ZMQ_LINGER 0 e toda leitura é não bloqueante (ZMQ_DONTWAIT): o processo encerra na hora e o event loop do Bun nunca congela dentro do C

Trade-offs

O que se ganha, o que se paga

ZeroMQ Broker (RabbitMQ, Kafka)
Infraestrutura Nenhuma: biblioteca no processo Um serviço a manter, monitorar e escalar
Latência Menor: um salto de rede Maior: dois saltos, com persistência no meio
Mensagem perdida Some se ninguém estiver ouvindo Fica na fila até alguém consumir
Descoberta Cada peer precisa saber o endereço do outro O broker é o ponto de encontro
Uso típico Cotação de câmbio, telemetria, sinal de mercado Pagamento, pedido, evento que não pode sumir

Cotação velha não vale nada — perder um tick é aceitável. Um PIX, não: esse caso é de infrastructure/rabbitmq.

apps/infrastructure/zeromq

8 arquivos

src/

  • zmq_ffi.tsBinding bun:ffi da libzmq: contexto, socket, opções, multipart não bloqueante
  • quote_fx.tsCotação em dois frames, com o par como tópico e número de sequência
  • feed_fx.tsFeed PUB publicando os três pares num intervalo
  • desk_fx.tsMesa SUB com assinatura por prefixo e contagem de ticks perdidos
  • config_zeromq.tsConfiguração validada do ambiente
  • demo.tsdemoDuas mesas no host conectadas ao feed do container

./

  • DockerfileImagem do feed: Ubuntu com libzmq5 e o binário do Bun
  • docker.shinfraSobe o feed com o código montado e espera o bind

Executar · com Docker

  1. bun install# dependências
  2. ./docker.sh up# sobe ZeroMQ
  3. cp .env.example .env# variáveis de ambiente
  4. bun run demo# roda o cenário
  5. bun run test# integração contra o serviço real
Requisitos
BunDocker
Sobe junto
ZeroMQ

Por que se relacionam

ZeroMQ no Bun: `bun:ffi`, não o pacote npm

O pacote npm zeromq é um addon N-API que chama uv_async_init, função que o Bun não implementa: o processo entra em panic na importação. src/zmq_ffi.ts abre a libzmq real (libzmq.so.5) com bun:ffi — a mesma biblioteca C, falando o mesmo protocolo que um peer em C, Go ou Python. O host precisa da libzmq5 (apt-get install libzmq5); a imagem do feed já a traz.

Teste rápido

Qual destes combina com ZeroMQ?

Próximo projeto · Infraestrutura em DockerSonarQube — quality gate como barreira de merge
Esc

↑ ↓ navegarEnter abrir191 resultados