Chat: Broker


1Introdução

O broker é um programa executado em segundo plano, cujo papel é receber as novas mensagens enviadas ao servidor (por meio do controlador Message) e transmiti-las a todos os navegadores conectados (por meio do controlador Event).

Mais precisamente, esse programa é um script de linha de comando gerenciado pelo Comma. Scripts CLI são escritos da mesma forma que os controladores web, com apenas algumas particularidades específicas.


2Código-fonte

Aqui está o código do arquivo cli/Broker.php:

<?php

/** Controlador do script broker. */
class Broker extends \Temma\Web\Controller {
    /** Ação principal. */
    public function run() {
        // ativação do socket
        $this->zmq_broker_pub->connect();
        // laço infinito
        while (true) {
            // lê uma nova mensagem enviada pelo controlador Message
            $msg = $this->zmq_broker_pull[''];
            // envia a mensagem para os controladores Event
            $this->zmq_broker_pub[''] = $msg;
        }
    }
}
  • Linha 4: definição do controlador Broker.
  • Linha 6: definição da ação run().
  • Linha 8: abertura explícita do socket ZeroMQ PUB (publicação). Normalmente isso não é necessário; os sockets ZeroMQ são abertos quando usados pela primeira vez. Neste caso, isso é necessário para que os controladores Event que tentarem se conectar a ele encontrem um socket que aceite conexões.
  • Linha 10: laço infinito.
  • Linha 12: leitura bloqueante no socket ZeroMQ PULL. O Temma lê e grava as fontes de dados como se fossem arrays associativos. Aqui, a chave é uma string vazia.
  • Linha 14: grava no socket ZeroMQ PUB a mensagem que acabou de ser recebida. Aqui também, a fonte de dados é manipulada como se fosse um array associativo, com uma string vazia como chave.

3Execução

O script é simplesmente iniciado com o comando:

$ bin/comma Broker run

3.1Início automático

Para garantir que o script seja executado automaticamente quando o servidor for iniciado, você pode usar o sistema init do Linux.

Para isso, basta criar um arquivo /etc/init.d/broker:

#!/bin/sh

/caminho/para/aplicacao/bin/comma Broker run

Não se esqueça de conceder permissão de execução ao script:

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

Por fim, configure o script para ser executado na inicialização:

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

3.2Reinício automático

É importante que o broker seja executado continuamente; caso contrário, as mensagens não serão enviadas a todos os usuários conectados.

O método de início automático explicado acima tem a vantagem de ser simples, mas, se o broker parar de funcionar por qualquer motivo, ele não será reiniciado automaticamente.
Existem várias soluções possíveis, mas uma das mais simples é usar o Supervisor.

Para instalar o Supervisor no Debian/Ubuntu:

$ sudo apt install supervisor

Em seguida, crie um arquivo /etc/supervisor/conf.d/broker.conf:

[program:broker]
command=/path/to/application/bin/comma Broker run
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/broker.log
stderr_logfile=/var/log/supervisor/broker-err.log
  • Linha 1: início da configuração do programa broker.
  • Linha 2: informe o caminho do programa a ser executado.
  • Linha 3: pede ao Supervisor para iniciar o programa automaticamente na inicialização.
  • Linha 4: pede ao Supervisor para reiniciar o programa caso ele seja interrompido.
  • Linha 5: caminho do arquivo de log para o qual será redirecionada a saída padrão do programa.
  • Linha 6: caminho do arquivo de log para o qual será redirecionada a saída de erro do programa.

Para que o Supervisor leve em conta esse arquivo de configuração:

$ sudo supervisorctl reread
$ sudo supervisorctl update

Em seguida, você pode controlar a execução do programa com os seguintes comandos (respectivamente para iniciar, parar e reiniciar o programa):

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