Paradigma publish/subscribe con Spring Data Redis

0
7116

Paradigma publish/subscribe con Spring Data Redis.

0. Índice de contenidos.


1. Introducción.

Ya vimos en un tutorial anterior una pequeña introducción al proyecto Spring Data y el soporte de Redis a través de la clase RedisTemplate. En aquel tutorial vimos un ejemplo práctico donde recuperábamos tweets a través del API de Twitter4j y los persistíamos en Redis añadiendo una clave cómun a todos por la que posteriormente los recuperábamos.

Ese código se quedaba un poco cojo y no nos valía para cubrir un caso de uso más complejo. El problema tenía que ver con la sincronización de los datos almacenados. La aplicación levantaba dos beans de Spring, uno que guardaba los tweets en Redis y otro que los recuperaba. El segundo realizaba un único acceso a Redis recuperando todos los tweets que cumplían con los criterios de búsqueda, pero ¿qué pasaba con los nuevos tweets introducidos posteriores a esa búsqueda?. Esos datos no los recuperábamos a menos que hiciéramos sucesivas consultas a Redis. Al buscar mediante un patrón que tenían todas las claves (tweet_) cada vez que hacemos una nueva búsqueda Redis nos devuelve todos los registros por lo que estaríamos repitiendo constantemente los tweets recuperados en sucesivas consultas.

Para solucionar este problema vamos a modificar la forma de introducir y recuperar los tweets en Redis ya que esta base de datos admite el paradigma de mensajería publicador/suscriptor. En nuestro ejemplo la clase encargada de recuperar los tweets los publicará en redis y construiremos una clase con Spring que se suscribirá para recibirlos inmediatamente en cuanto son publicados.

2. Entorno.

El tutorial se ha realizado con el siguiente entorno:

  • MacBook Pro 15′ (2.4 GHz Intel Core i5, 8GB DDR3 SDRAM).
  • Sistema Operativo: Mac OS Mavericks 10.9.5
  • Oracle Java SDK 1.7.0_60
  • Redis 2.8.11

3. Publicar en Redis

A través de nuestra clase Repository disponemos del método send que publica el contenido en un determinado canal para que suscriptores al mismo lo reciban. Vamos a modificar el ejemplo que utilizamos en el tutorial de Redis para publicar los tweets. Simplemente modificaremos la forma de almacenar los tweets en redis (línea 53) utilizando el método send que se encarga de publicarlo en el canal ‘tweets’.

El método send del StringRedisRepository llama al método convertAndSend del StringRedisTemplate

4. Suscripción a un canal de Redis.

Con Spring Data Redis es muy sencillo configurar la suscripción a un canal de Redis, bastará con crear una clase suscriptora de los mensajes asociados a un topic y un poco de configuración. Lo haremos todo en nuestra clase Application encargada de levantar el contexto de Spring y de configurar los Beans que necesitamos.

Configuramos un RedisMessageListenerContainer al que añadimos mediante el método addMessageListener un MessageListenerAdapter que recibe una clase suscriptora de los mensajes.

Esta clase debemos implementarla y crear el método receiveTweet que será el que se invocará cuando se publique un mensaje en Redis que cumpla el patrón indicado en la definición del listener: new PatternTopic(TweetIngestor.TWEETS_SUBSCRIPTION_CHANNEL), concretamente el topic es el mismo con el que se publicaron los tweets.

La clase suscriptora define el método receiveTweets en formato JSON que es como los publicamos en Redis. Posteriormente se parsea y únicamente recuperamos el usuario y el texto del tweet que imprimimos por consola.

Para probar nuestro código levantamos el servidor de redis (redis-server) y el ejemplo con mvn spring-boot:run y pasados unos segundos aparecerán por consola los tweets que previamente han pasado por Redis. Si queremos suscribrirnos al topic desde el cliente de Redis basta con lanzar el comando desde la consola del redis-cli:

5. Referencias

6. Conclusiones.

Hemos visto un ejemplo de uso de la funcionalidad para mensajería publish/subscribe de Redis una más de las muchas que soporta.

A través de las APIs que nos proporcionan un Driver de conexión (como Jedis) ya se nos facilita mucho la tarea para trabajar con Redis pero junto al soporte de Spring Data el uso de Redis parece un juego de niños.

Espero que te haya sido de ayuda.

Un saludo.

Juan

Dejar respuesta

Please enter your comment!
Please enter your name here