Fuente de datos: ZeroMQ
1Presentación
Esta fuente de datos permite usar la biblioteca de red ZeroMQ, que facilita la transferencia de datos añadiendo funcionalidades a los sockets de red convencionales.
Importante: ZeroMQ puede gestionar varios tipos de comunicación. Estas pueden ser conexiones de red
("TCP") entre máquinas, conexiones entre procesos ("IPC") dentro del mismo ordenador, o
conexiones entre hilos dentro del mismo proceso ("inproc").
Por razones específicas de implementación (imposibilidad de compartir el contexto de ZeroMQ), aquí solo se
gestionan las conexiones TCP.
Si has configurado correctamente los parámetros de conexión, Temma creará automáticamente un objeto de tipo \Temma\Datasources\ZeroMQ. Por convención, supondremos que has nombrado esta conexión zmq en el archivo etc/temma.php (consulta la documentación de configuración).
La conexión está entonces disponible en el controlador de la siguiente forma:
$zmq = $this->zmq;
En los demás objetos gestionados por el componente de inyección de dependencias, la conexión es accesible de la siguiente forma:
$zmq = $loader->dataSources->zmq;
$zmq = $loader->dataSources['zmq'];
2Instalación
Para usar esta fuente de datos, necesitas tener instalada la extensión php-zmq.
Consulta la documentación de PHP o la documentación de tu sistema operativo. Por ejemplo, en Ubuntu Linux, esta extensión y sus dependencias se instalan simplemente con el siguiente comando:
$ sudo apt install php-zmq
3Configuración
En el archivo etc/temma.php (consulta documentación de configuración), declaras el DSN (Data Source Name) usado para abrir el socket ZeroMQ.
Al crear un socket ZeroMQ, primero debes determinar si el socket estará escuchando conexiones entrantes, o si se conectará a un socket ZeroMQ que esté escuchando.
Los sockets en escucha pueden escuchar en varias direcciones IP y/o números de puerto diferentes.
Su DSN se escribe como: zmq-bind://TYPE@SERVER:PORT[;SERVER:PORT…]
El DSN de los sockets de conexión se escribe como: zmq://TYPE@SERVER:PORT[;SERVER:PORT…]
-
TYPE: es el tipo de socket ZeroMQ que se creará.
- REQ: (request) envía mensajes a un socket REP, y recibe mensajes de respuesta.
- REP: (reply) recibe mensajes enviados por un socket REQ, y envía mensajes en respuesta (cada mensaje recibido debe ir seguido de una respuesta).
- PUSH: envía mensajes de sentido único a un socket PULL.
- PULL: recibe mensajes enviados por un socket PUSH (sin opción de responder).
- PUB: (publish) envía mensajes de sentido único a todos los sockets SUB conectados.
- SUB: (subscribe) recibe mensajes enviados por un socket PUB (sin opción de responder).
- SERVER: es el nombre del servidor al que conectarse, o su dirección IP. Para un socket en escucha, el servidor puede sustituirse por un asterisco (*) para escuchar en todas las interfaces de red del ordenador.
- PORT: es el número de puerto de conexión.
Un socket ZeroMQ puede escuchar en varias interfaces de red, o conectarse a varios sockets al mismo tiempo.
En el caso de un socket en escucha, esto permite escuchar en varias interfaces de red o números de puerto
diferentes. En el caso de un socket de conexión, esto permite intercambiar datos con varios servidores al
mismo tiempo.
En todos los casos, el socket ZeroMQ se gestiona de la misma forma, independientemente del número de
interfaces de red conectadas a él.
Cuando hay varios pares SERVER:PORT, se separan entre sí mediante un punto y coma (;).
Ejemplos:
- 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;otro_servidor: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;servicio-externo.com:8000
4Llamadas unificadas
4.1Acceso tipo array
// escribe datos (serializados) en el socket
$zmq[''] = $data;
// lee datos (deserializados)
$data = $zmq[''];
4.2Gestión de datos serializados
// escribe datos (serializados) en el socket
$zmq->set('', $data);
// escribe varios datos (serializados)
$zmq->mSet([
$data1,
$data2,
$data3,
]);
// lee datos (deserializados)
$data = $zmq->get('');
4.3Gestión de datos en bruto
// escribe datos en bruto
$zmq->write('', $str);
// escribe varios datos (en bruto)
$zmq->mWrite([
$str1,
$str2,
$str3,
]);
// lee datos (en bruto)
$str = $zmq->read('');