Fonte de dados: ZeroMQ


1Apresentação

Esta fonte de dados torna possível usar a biblioteca de rede ZeroMQ, que facilita a transferência de dados adicionando funcionalidades aos sockets de rede convencionais.

Importante: o ZeroMQ pode lidar com vários tipos de comunicação. Estas podem ser conexões de rede ("TCP") entre máquinas, conexões entre processos ("IPC") dentro do mesmo computador, ou conexões entre threads dentro do mesmo processo ("inproc").
Por razões específicas de implementação (impossibilidade de compartilhar o contexto do ZeroMQ), apenas conexões TCP são tratadas aqui.

Se você configurou corretamente os parâmetros de conexão, o Temma criará automaticamente um objeto do tipo \Temma\Datasources\ZeroMQ. Por convenção, vamos supor que você nomeou essa conexão zmq no arquivo etc/temma.php (veja a documentação de configuração).

A conexão fica então disponível no controlador da seguinte forma:

$zmq = $this->zmq;

Nos demais objetos gerenciados pelo componente de injeção de dependências, a conexão é acessível da seguinte forma:

$zmq = $loader->dataSources->zmq;
$zmq = $loader->dataSources['zmq'];

2Instalação

Para usar esta fonte de dados, você precisa ter instalado a extensão php-zmq.

Consulte a documentação do PHP ou a documentação do seu sistema operacional. Por exemplo, no Ubuntu Linux, essa extensão e suas dependências são instaladas simplesmente com o seguinte comando:

$ sudo apt install php-zmq

3Configuração

No arquivo etc/temma.php (veja a documentação de configuração), você declara o DSN (Data Source Name) usado para abrir o socket ZeroMQ.

Ao criar um socket ZeroMQ, você deve primeiro determinar se o socket ficará escutando conexões recebidas, ou se ele se conectará a um socket ZeroMQ que está escutando.

Sockets em escuta podem escutar em vários endereços IP e/ou números de porta diferentes.
Seu DSN é escrito como: zmq-bind://TYPE@SERVER:PORT[;SERVER:PORT…]

O DSN dos sockets de conexão é escrito como: zmq://TYPE@SERVER:PORT[;SERVER:PORT…]

  • TYPE: é o tipo de socket ZeroMQ a ser criado.
    • REQ: (request) envia mensagens para um socket REP, e recebe mensagens de resposta.
    • REP: (reply) recebe mensagens enviadas por um socket REQ, e envia mensagens em resposta (cada mensagem recebida deve ser seguida por uma resposta).
    • PUSH: envia mensagens de mão única para um socket PULL.
    • PULL: recebe mensagens enviadas por um socket PUSH (sem a opção de responder).
    • PUB: (publish) envia mensagens de mão única para todos os sockets SUB conectados.
    • SUB: (subscribe) recebe mensagens enviadas por um socket PUB (sem a opção de responder).
  • SERVER: é o nome do servidor ao qual se conectar, ou seu endereço IP. Para um socket em escuta, o servidor pode ser substituído por um asterisco (*) para escutar em todas as interfaces de rede do computador.
  • PORT: é o número da porta de conexão.

Um socket ZeroMQ pode escutar em várias interfaces de rede, ou se conectar a vários sockets ao mesmo tempo. No caso de um socket em escuta, isso permite escutar em várias interfaces de rede ou números de porta diferentes. No caso de um socket de conexão, isso permite trocar dados com vários servidores ao mesmo tempo.
Em todos os casos, o socket ZeroMQ é tratado da mesma forma, independentemente do número de interfaces de rede conectadas a ele.
Quando há vários pares SERVER:PORT, eles são separados uns dos outros por um ponto e vírgula (;).

Exemplos:

  • zmq-bind://REP@127.0.0.1:5000
  • zmq://REQ@127.0.0.1:5000
  • zmq-bind://PULL@*:6000
  • zmq://PUSH@127.0.0.1:6000;other_server:6000
  • zmq-bind://PUB@127.0.0.1:6000;192.168.0.1:6500;10.0.0.1:7000
  • zmq://SUB@192.168.0.1:6500;external-service.com:8000

4Chamadas unificadas

4.1Acesso tipo array

// grava dados (serializados) no socket
$zmq[''] = $data;

// lê dados (desserializados)
$data = $zmq[''];

4.2Gerenciamento de dados serializados

// grava dados (serializados) no socket
$zmq->set('', $data);

// grava múltiplos dados (serializados)
$zmq->mSet([
    $data1,
    $data2,
    $data3,
]);

// lê dados (desserializados)
$data = $zmq->get('');

4.3Gerenciamento de dados brutos

// grava dados brutos
$zmq->write('', $str);

// grava múltiplos dados (brutos)
$zmq->mWrite([
    $str1,
    $str2,
    $str3,
]);

// lê dados (brutos)
$str = $zmq->read('');