Source de données : ZeroMQ


1Présentation

Cette source de données permet d'utiliser la bibliothèque réseau ZeroMQ, qui facilite les transferts de données en y ajoutant des fonctionnalités par rapport aux sockets réseau classiques.

Important : ZeroMQ est capable de gérer plusieurs types de communications. Cela peut être des connexions réseau ("TCP") entre des machines, connexions inter-processus ("IPC") au sein d'un même ordinateur, ou connexions entre les threads d'un même processus ("inproc").
Pour des raisons spécifiques d'implémentation (impossibilité de partager le contexte ZeroMQ), seules les connexions TCP sont gérées ici.

Si vous avez correctement configuré les paramètres de connexion, Temma crée automatiquement un objet de type \Temma\Datasources\ZeroMQ. Par convention, nous partirons du principe que vous avez nommé cette connexion zmq dans le fichier etc/temma.php (voir la documentation de la configuration).

La connexion est alors disponible dans le contrôleur en écrivant :

$this->zmq

Dans les autres objets gérés par le composant d'injection de dépendances, la connexion par socket est accessible en écrivant :

$loader->dataSources['zmq']

2Installation

Pour pouvoir utiliser cette source de données, il faut avoir installé l'extension php-zmq.

Référez-vou à voir la documentation PHP ou la documentation de votre système d'exploitation. Par exemple, sous Linux Ubuntu, cette extension et ses dépendances s'installent simplement avec la commande suivante :

$ sudo apt install php-zmq

3Configuration

Dans le fichier etc/temma.php (voir la documentation de la configuration), vous déclarez le DSN (Data Source Name) qui permet d'ouvrir une socket ZeroMQ.

À la création d'une socket ZeroMQ, il faut d'abord déterminer si la socket va être en écoute pour attendre des connexions entrantes, ou si elle va se connecter à une socket ZeroMQ qui est en écoute.

Les sockets en écoute peuvent écouter sur plusieurs adresses IP et/ou numéros de port différents.
Leur DSN s'écrit de la forme : zmq-bind://TYPE@SERVEUR:PORT[;SERVEUR:PORT…]

Le DSN des sockets qui se connectent s'écrit de la forme : zmq://TYPE@SERVEUR:PORT[;SERVEUR:PORT…]

  • TYPE : est le type de socket ZeroMQ à créer.
    • REQ : (request) envoi de messages vers une socket de type REP, et réception des messages de réponse.
    • REP : (reply) réception des messages envoyés par une socket de type REQ, et envoi de messages en retour (chaque message reçu doit être suivi d'une réponse).
    • PUSH : envoi de messages à sens unique vers une socket de type PULL.
    • PULL : réception des messages envoyés par une socket de type PUSH (sans possibilité d'y répondre).
    • PUB : (publish) envoi de messages à sens unique à toutes les sockets SUB connectées.
    • SUB : (subscribe) réception des messages envoyés par une socket de type PUB (sans possibilité d'y répondre).
  • SERVEUR : est le nom du serveur auquel se connecter, ou son adresse IP. Pour une socket en écouter, le serveur peut être remplacé par un astérisque (*) afin d'écouter sur toutes les interfaces réseau de l'ordinateur.
  • PORT : est le numéro de port de connexion.

Une socket ZeroMQ peut écouter sur plusieurs interfaces réseau, ou se connecter à plusieurs sockets en même temps. Dans le cas d'une socket en écoute, cela permet d'écouter sur plusieurs interfaces réseau ou plusieurs numéros de ports différents. Dans le cas d'une socket qui se connecte, cela permet d'échanger avec plusieurs serveurs à la fois.
Dans tous les cas, la socket ZeroMQ se manipule de la même manière, quelque soit le nombre d'interfaces réseau qui lui sont attachées.
Lorsqu'il y a plusieurs couples SERVEUR:PORT, ils sont séparés les uns des autres avec un caractère point-virgule (;).

Exemples :

  • 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;autre_serveur: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;service-externe.com:8000

4Appels unifiés

4.1Accès de type tableau

// écriture de données (sérialisées) sur la socket
$this->zmq[''] = $data;

// lecture de données (désérialisées)
$data = $this->zmq[''];

4.2Gestion de données sérialisées

// écriture de données (sérialisées) sur la socket
$this->zmq->set('', $data);

// écriture de plusieurs données (sérialisées)
$this->zmq->mSet([
    $data1,
    $data2,
    $data3,
]);

// lecture d'une donnée (désérialisée)
$data = $this->zmq->get('');

4.3Gestion de données brutes

// écriture de données (brutes)
$this->zmq->write('', $str);

// écriture de plusieurs données (brutes)
$this->sock->mWrite({
    $str1,
    $str2,
    $str3,
]);

// lecture de données (brutes)
$str = $this->zmq->read('');