Mientras que Redis es popular como una solución de almacenamiento de datos y caché para la aplicación, también es una gran herramienta para implementar una interacción de publicación-suscripción. Sin embargo, el patrón de publicación-suscripción a menudo suena complicado de implementar. Por el contrario, implementar Redis PubSub en NodeJS es bastante simple y directo.
¿Qué es Redis PubSub?
Redis soporta el paradigma de mensajería publish/subscribe.
En el patrón de mensajería publish/subscribe, los editores no envían mensajes o datos directamente a los suscriptores. En su lugar, los editores envían el mensaje a un canal. Uno o más suscriptores pueden suscribirse a este canal para recibir los mensajes.
En otras palabras, el patrón pub/sub es un enfoque de "disparar y olvidar" desde la perspectiva del editor.
En Redis PubSub, la instancia de Redis actúa como puente entre editores y suscriptores. Un editor publica el mensaje junto con un nombre de tema que lo identifica. Se puede pensar en el nombre del tema como un canal. Los suscriptores se suscriben al tema. Cada vez que se publica un nuevo mensaje para un tema, los suscriptores pueden escuchar el mensaje y actuar sobre ellos.
Ahora que entendemos lo que es Pub Sub, vamos a construir una pequeña aplicación de ejemplo para ver el patrón en acción.
Instalación de paquetes
Para demostrar el Redis PubSub en NodeJS, crearemos dos aplicaciones - una como editor y la segunda como suscriptor.
Ve a continuación a la configuración del proyecto para la aplicación del editor
$ mkdir publisher
$ npm init -y
$ npm install --save redis express
Del mismo modo, podemos configurar la aplicación de abonado.
$ mkdir subscriber
$ npm init -y
$ npm install --save redis express
El paquete redis proporciona soporte para conectarse a una instancia de Redis. Por otro lado, el paquete express nos ayuda a crear un servidor web NodeJS que puede escuchar las peticiones entrantes.
Creando el Redis NodeJS Publisher
Con los respectivos proyectos listos, ahora podemos escribir la lógica para el Redis NodeJS Publisher.
Vamos a ver el siguiente ejemplo:
const express = require('express');
const redis = require('redis');
const publisher = redis.createClient()
publisher.connect()
const app = express()
app.get("/", (req, res) => {
const message = {
msg: "Hello, World"
}
publisher.publish('test', JSON.stringify(message))
res.send("Published Event Using Redis");
})
app.listen(3000, () => {
console.log('Server is listening on port 3000');
})
Técnicamente, esta es una aplicación muy simple. Llamamos a redis.createClient() para obtener una instancia del cliente Redis. A continuación, llamamos al método connect para establecer la conexión.
Nótese que esta sentencia espera que una instancia de Redis se ejecute en el puerto 6379 de localhost.
Para publicar un mensaje, utilizamos el método publish(). Este método toma dos parámetros como entrada. El primero es el tema o canal (en este caso, test). El segundo es la cadena de mensajes real.
Invocamos la funcionalidad de publicación de Redis cuando el usuario activa el manejador de solicitudes
http://localhost:3000.
Creando el suscriptor de Redis NodeJS
A continuación, podemos crear la parte del suscriptor del patrón Redis PubSub.
const express = require("express")
const redis = require("redis")
const subscriber = redis.createClient()
subscriber.connect()
const app = express()
subscriber.subscribe('test', (message) => {
console.log(message);
});
app.get("/", (req, res) => {
res.send("Subscriber One")
})
app.listen(3001, () => {
console.log("server is listening to port 3001")
})
Podemos crear una instancia del Cliente Redis utilizando la función createClient() y conectarnos a la instancia.
Para suscribirte al mensaje, utilizamos la función subscribe(). Básicamente, esta función toma dos entradas. La primera es el nombre del tema o del canal (en este caso, utilizamos de nuevo test). El segundo argumento es una función callback que tiene el mensaje como carga útil.
Podemos procesar el mensaje dentro de la función callback. En nuestro ejemplo, simplemente imprimimos el mensaje en la consola.
Observa que iniciamos la aplicación del suscriptor en un puerto diferente (3001) ya que el host es el mismo.
Redis Pub Sub en NodeJS hace que sea extremadamente sencillo construir aplicaciones utilizando el patrón publish-subscribe. En este post, hemos visto el patrón pub sub con ejemplos sencillos.