Pular para o conteúdo principal

Transporte ZeroMQ

O transporte ZMQ permite que agentes se comuniquem por rede, incluindo máquinas diferentes. É baseado na biblioteca ZeroMQ, que usa C/C++ internamente e opera na casa dos microssegundos em rede local.

PUB/SUB — Assíncrono

Cada agente publica em um endereço e assina em outro. Não ha bloqueio — se o consumidor estiver atrasado, ele le a última mensagem disponível.

from synapsys.transport import ZMQTransport
import numpy as np

# Planta (publicador)
pub = ZMQTransport("tcp://0.0.0.0:5555", mode="pub")
pub.write("y", np.array([3.14]))

# Controlador (assinante)
sub = ZMQTransport("tcp://192.168.1.10:5555", mode="sub")
y = sub.read("y")

Topologia bidirecional

Planta:       PUB :5555  ->  SUB :5556
Controlador: PUB :5556 -> SUB :5555

REQ/REP — Lock-step

Garante sincronismo total: o cliente bloqueia até receber a resposta.

from synapsys.transport import ZMQReqRepTransport

# Planta (servidor)
server = ZMQReqRepTransport("tcp://0.0.0.0:5555", mode="server")
u = server.read("u")
server.write("y", y_array)

# Controlador (cliente)
client = ZMQReqRepTransport("tcp://localhost:5555", mode="client")
client.write("u", u_array)
y = client.read("y")
Ordem importa no REQ/REP

O servidor deve fazer read() antes de write(), e o cliente write() antes de read(). Inverter a ordem causa deadlock.

Latência

CenarioLatência tipica
Loopback (localhost)~50–100 µs
LAN 1 Gbps~100–300 µs
WAN / Internet> 1 ms

Para comparação, SharedMemoryTransport opera em < 1 µs.

Referência da API

Consulte a referência completa em synapsys.transport — ZMQTransport.