Chat: Visión general y configuración
1Visión general
El objetivo de este tutorial es crear un sistema de chat multiusuario en tiempo real. Los usuarios tendrán acceso a una interfaz muy simple, con un pequeño formulario para introducir su nombre y sus mensajes, y debajo la lista de mensajes enviados y recibidos.
1.1Tecnologías
Para llevar a cabo este desarrollo, vamos a usar dos tecnologías específicas (que Temma gestiona de forma nativa): SSE (Server-Sent Events) y la comunicación de red ZeroMQ.
- Los SSE se usan para enviar mensajes del servidor a los navegadores conectados al chat.
- Las conexiones de red ZeroMQ se usan para la comunicación entre los controladores y un "broker de mensajes", cuyo papel es reenviar los mensajes recibidos a todos los controladores que envían SSE.
1.2Controladores
Además del controlador que muestra la interfaz web, hay dos controladores que gestionan los intercambios de datos entre el navegador y el servidor:
- Los navegadores se conectan a los controladores Event en cuanto se carga la página web. Estos controladores envían SSE cada vez que un usuario envía un mensaje. Por lo tanto, hay tantos controladores Event en ejecución como navegadores conectados al sitio.
- Los controladores Message son llamados vía AJAX por los navegadores cuando un usuario envía un mensaje.
1.3Funcionamiento
Aquí tienes una visión general de cómo se envía un mensaje al servidor:
- El mensaje (y el nombre del usuario) se envía al servidor mediante una petición AJAX estándar.
- El controlador Message que recibe el mensaje abre un socket ZeroMQ de tipo PUSH hacia el broker, para transmitir el mensaje.
- El broker, que estaba en lectura bloqueante en su socket PULL, recibe el mensaje. Lo reenvía a su socket de salida PUB (publicación).
- Todos los controladores Event conectados al socket PUB del broker con un socket SUB (suscripción) reciben el mensaje. Lo reenvían vía SSE a los navegadores conectados a ellos.
2Archivo de configuración
Por lo tanto, hay cuatro sockets ZeroMQ diferentes: PULL y PUB los usa el broker, PUSH lo usan los controladores Message y SUB lo usan los controladores Event.
En el archivo de configuración etc/temma.php, vamos a declarar una fuente de datos distinta para cada tipo de socket ZeroMQ. Aunque no todos los sockets se usan al mismo tiempo (el broker usa dos de los cuatro, los controladores solo uno), esto no supone ningún problema, ya que las conexiones no se abren realmente hasta que se usan por primera vez.
Este es el contenido del archivo:
<?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',
],
];
Las fuentes de datos son:
- zmq_client_push: socket PUSH usado por el controlador Message para enviar al broker el mensaje que ha recibido.
- zmq_broker_pull: socket PULL usado por el broker para recibir los mensajes enviados por los controladores Message.
- zmq_broker_pub: socket PUB usado por el broker para redistribuir los mensajes recibidos a todos los controladores Event.
- zmq_client_sub: socket SUB usado por los controladores Event para recibir los mensajes publicados por el broker.
En la línea 11, las sesiones están desactivadas, ya que no las necesitaremos.
En la línea 12, definimos que el controlador raíz (el que responde a la URL "/") es el objeto Homepage.