Chat : Broker


1Présentation

Le broker est un programme qui tourne en tâche de fond, et qui a pour rôle de recevoir les nouveaux messages qui sont envoyés au serveur (via le contrôleur Message), et de les transmettre à tous les navigateurs connectés (via le contrôleur Event).

Plus précisément, ce programme est un script en ligne de commande géré par Comma. Les scripts CLI s’écrivent globalement comme des contrôleurs web, avec juste quelques spécificités.


2Code source

Voici le code du fichier cli/Broker.php :

<?php

/** Contrôleur de script broker. */
class Broker extends \Temma\Web\Controller {
    /** Action principale. */
    public function run() {
        // activation de la socket
        $this->zmq_broker_pub->connect();
        // boucle infinie
        while (true) {
            // lecture d'un nouveau message envoyé par le contrôleur Message
            $msg = $this->zmq_broker_pull[''];
            // envoi du message aux contrôleurs Event
            $this->zmq_broker_pub[''] = $msg;
        }
    }
}
  • Ligne 4 : Définition du contrôleur Broker.
  • Ligne 6 : Définition de l'action run().
  • Ligne 8 : Ouverture explicite de la socket ZeroMQ PUB (publication). En temps normal, cela n’est pas nécessaire, les sockets ZeroMQ sont ouvertes au moment où elles sont utilisées pour la première fois. Là, c’est nécessaire pour que les contrôleurs Event qui tenteront de s’y connecter trouvent une socket qui accepte les connexions.
  • Ligne 10 : Boucle infinie.
  • Ligne 12 : Lecture bloquante sur la socket ZeroMQ PULL. Avec Temma, on lit et on écrit dans les sources de données comme si c’était des tableaux associatifs. Ici, la clé est une chaîne vide.
  • Ligne 14 : Écriture sur la socket ZeroMQ PUB du message qui vient d’être reçu. Là encore, on manipule la source de données comme un tableau associatif, avec une chaîne vide comme clé.

3Exécution

Le script se lance simplement avec la commande :

$ bin/comma Broker run

3.1Démarrage automatique

Pour s'assurer que le script est exéuté automatiquement au lancement du serveur, il est possible d'utiliser le système init de Linux.

Pour cela, il suffit de créer un fichier /etc/init.d/broker :

#!/bin/sh

/chemin/vers/application/bin/comma Broker run

Pensez à rendre le script exécutable :

$ sudo chmod +x /etc/init.d/broker

Enfin, il faut ajouter le script au démarrage :

$ sudo update-rc.d broker start 01 2 .

3.2Redémarrage automatique

Il est important que le broker tourne en permanence, sinon les messages ne seront pas transmis à tous les utilisateurs connectés.

La méthode de démarrage automatique expliquée ci-dessus a l'avantage d'être simple, mais si jamais le broker venait à s'interrompre − quelle qu'en soit la raison − il ne sera pas redémarré automatiquement.
Plusieurs solutions peuvent exister, l'une des plus simples est d'utiliser Supervisor.

Pour installer Supervisor sur Debian/Ubuntu :

$ sudo apt install supervisor

Ensuite, créez un fichier /etc/supervisor/conf.d/broker.conf :

[program:broker]
command=/chemin/vers/application/bin/comma Broker run
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/broker.log
stderr_logfile=/var/log/supervisor/broker-err.log
  • Ligne 1 : Début de la configuration du programme broker.
  • Ligne 2 : On donne le chemin vers le programme à exécuter.
  • Ligne 3 : On demande à Supervisor de lancer le programme automatiquement au démarrage.
  • Ligne 4 : On lui demande de relancer le programme si jamais il venait à s’interrompre.
  • Ligne 5 : Chemin vers le fichier de log vers lequel sera redirigée la sortie standard du programme.
  • Ligne 6 : Chemin vers le fichier de log vers lequel sera redirigée la sortie d’erreur du programme.

Pour que Supervisor prenne en compte ce fichier de configuration :

$ sudo supervisorctl reread
$ sudo supervisorctl update

Ensuite, il est possible de contrôler l’exécution du programme avec les commandes suivantes (respectivement pour démarrer, arrêter et redémarrer le programme) :

$ sudo supervisorctl start broker
$ sudo supervisorctl stop broker
$ sudo supervisorctl restart broker