Chat: Visão geral e configuração


1Visão geral

O objetivo deste tutorial é criar um sistema de chat multiusuário em tempo real. Os usuários terão acesso a uma interface bem simples, com um pequeno formulário para digitar o nome e as mensagens, e, abaixo, a lista de mensagens enviadas e recebidas.


1.1Tecnologias

Para realizar esse desenvolvimento, vamos usar duas tecnologias específicas (ambas gerenciadas nativamente pelo Temma): SSE (Server-Sent Events) e a comunicação de rede ZeroMQ.

  • As SSEs são usadas para enviar mensagens do servidor aos navegadores conectados ao chat.
  • As conexões de rede ZeroMQ são usadas para a comunicação entre os controladores e um "broker de mensagens", cujo papel é encaminhar as mensagens recebidas a todos os controladores que enviam SSEs.

1.2Controladores

Além do controlador que exibe a interface web, existem dois controladores que gerenciam a troca de dados entre o navegador e o servidor:

  • Os navegadores se conectam aos controladores Event assim que a página web é carregada. Esses controladores enviam SSEs a cada mensagem enviada por um usuário. Portanto, há tantos controladores Event em execução quanto navegadores conectados ao site.
  • Os controladores Message são chamados via AJAX pelos navegadores quando um usuário envia uma mensagem.

1.3Como funciona

Aqui está uma visão geral de como uma mensagem é enviada ao servidor:

  1. A mensagem (e o nome do usuário) é enviada ao servidor por meio de uma requisição AJAX comum.
  2. O controlador Message que recebe a mensagem abre um socket ZeroMQ do tipo PUSH para o broker, a fim de transmitir a mensagem.
  3. O broker, que estava em leitura bloqueante no seu socket PULL, recebe a mensagem. Ele a encaminha ao seu socket de saída PUB (publicação).
  4. Todos os controladores Event conectados ao socket PUB do broker com um socket SUB (assinatura) recebem a mensagem. Eles a encaminham via SSE aos navegadores conectados a eles.

2Arquivo de configuração

Portanto, existem quatro sockets ZeroMQ diferentes: PULL e PUB são usados pelo broker, PUSH é usado pelos controladores Message e SUB é usado pelos controladores Event.

No arquivo de configuração etc/temma.php, vamos declarar uma fonte de dados diferente para cada tipo de socket ZeroMQ. Mesmo que nem todos os sockets sejam usados ao mesmo tempo (o broker usa dois dos quatro, os controladores usam apenas um), isso não é um problema, pois as conexões só são realmente abertas quando usadas pela primeira vez.

Aqui está o conteúdo do arquivo:

<?php

return [
    'application' => [
        'dataSources' => [
            'zmq_client_push' => 'zmq://PUSH@127.0.0.1:5000',
            'zmq_broker_pull' => 'zmq-bind://PULL@127.0.0.1:5000',
            'zmq_broker_pub'  => 'zmq-bind://PUB@127.0.0.1:6000',
            'zmq_client_sub'  => 'zmq://SUB@127.0.0.1:6000',
        ],
        'enableSessions' => false,
        'rootController' => 'Homepage',
    ],
];

As fontes de dados são:

  • zmq_client_push: socket PUSH usado pelo controlador Message para enviar ao broker a mensagem que recebeu.
  • zmq_broker_pull: socket PULL usado pelo broker para receber as mensagens enviadas pelos controladores Message.
  • zmq_broker_pub: socket PUB usado pelo broker para redistribuir as mensagens recebidas a todos os controladores Event.
  • zmq_client_sub: socket SUB usado pelos controladores Event para receber as mensagens publicadas pelo broker.

Na linha 11, as sessões são desativadas, pois não vamos precisar delas.
Na linha 12, definimos que o controlador raiz (o que responde pela URL "/") é o objeto Homepage.