Explicación detallada del modo de suscripción y publicación de mensajes de Redis, desde los primeros pasos hasta el dominio [Capítulo avanzado]


inserte la descripción de la imagen aquí

0. Prefacio

El Patrón Publish-Subscribe (Patrón Publish-Subscribe) es un patrón de mensajería cuyo principio básico es que el remitente (editor) del mensaje no envía directamente el mensaje a un receptor específico (suscriptor), sino que divide el mensaje en diferentes categorías ( canales), y luego enviar mensajes a todos los receptores suscritos a esas categorías. El modelo de publicación-suscripción se usa ampliamente en sistemas distribuidos, como envío de mensajes en tiempo real, recopilación de registros, etc.

En Redis, el modelo de publicación-suscripción tiene dos roles principales: publicador y suscriptor. El editor envía un mensaje al canal especificado a través del comando PUBLISH, y el suscriptor se suscribe/da de baja al canal especificado a través del comando SUBSCRIBE, y recibe el mensaje enviado por el editor a través del oyente (Callback).
La siguiente figura muestra el canal canal1 y la relación entre los tres clientes suscritos a este canal: cliente2, cliente5 y cliente1:
inserte la descripción de la imagen aquí

Cuando se envía un nuevo mensaje al canal channel1 a través del comando PUBLICAR, este mensaje se enviará a los tres clientes suscritos al mismo:

inserte la descripción de la imagen aquí

1. Principios básicos

La publicación-suscripción de Redis es un modo de comunicación de mensajes a través del cual varios clientes pueden publicar y suscribirse a los mensajes. Redis proporciona los siguientes comandos para implementar funciones de publicación y suscripción:

  1. PUBLICAR mensaje de canal: envíe el mensaje de mensaje al canal de canal especificado, y el valor devuelto es la cantidad de suscriptores que recibieron el mensaje.
  2. SUSCRÍBETE canal [canal…]: Suscríbete a uno o más canales de canal, y cada vez que se publiquen nuevos mensajes en los canales suscritos, se recibirán los mensajes correspondientes.
  3. UNSUBSCRIBE [canal [canal...]]: Cancela la suscripción de uno o más canales, si no se especifica ningún canal, cancela la suscripción de todos los canales.
  4. Patrón PSUBSCRIBE [patrón...]: suscríbase a uno o más canales que coincidan con el patrón de patrón especificado, y cada vez que se publique un nuevo mensaje en un canal que coincida con el patrón, se recibirá el mensaje correspondiente.
  5. PUNSUBSCRIBE [patrón [patrón...]]: cancela la suscripción de uno o más canales que coincidan con el patrón de patrón especificado, si no se especifica ningún patrón, cancela la suscripción de todos los patrones.
  6. Subcomando PUBSUB [argumento [argumento…]]: Ver el estado del sistema de suscripción y publicación, que se puede utilizar para obtener información diversa del sistema de suscripción y publicación, como el número de suscriptores, la lista de canales, etc. Entre ellos, el
    comando PUBLISH se usa para publicar mensajes en el canal especificado, el comando SUBSCRIBE se usa para suscribirse a uno o más canales, el
    comando PSUBSCRIBE se usa para suscribirse a uno o más canales que cumplan con el modo especificado y el comando PUBSUB El comando se utiliza para ver el estado del sistema de suscripción y publicación.

1.1 Publicación/suscripción basada en canales

Los canales en Redis son equivalentes a la clasificación de mensajes. Un canal puede tener múltiples suscriptores y un suscriptor también puede suscribirse a múltiples canales. En Redis, envíe un mensaje al canal especificado a través del comando PUBLICAR, suscriba/cancele la suscripción al canal especificado a través del comando SUBSCRIBE y reciba el mensaje enviado por el editor a través del oyente.

Este es un ejemplo de publicación/suscripción basada en canales en la interfaz de línea de comandos de Redis:

# 订阅频道
127.0.0.1:6379> SUBSCRIBE news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1

# 发布消息
127.0.0.1:6379> PUBLISH news "Hello, world!"
(integer) 1

# 订阅者接收到消息
1) "message"
2) "news"
3) "Hello, world!"

En Redis, la implementación del modo de publicación/suscripción se basa en el mecanismo de eventos de Redis, es decir, el suscriptor agrega su propio oyente al looper de eventos del servidor de Redis ejecutando el comando SUBSCRIBE.Cuando el publicador envía un mensaje al canal especificado a través del comando PUBLICAR, el servidor Redis enviará el mensaje a todos los suscriptores que escuchan el canal.

Específicamente, el servidor Redis mantiene un ciclo de eventos y registra todos los oyentes de clientes en él. Cuando un cliente se suscribe a un canal a través del comando SUBSCRIBE, el servidor de Redis agregará el agente de escucha del cliente al controlador de eventos asociado con el canal y registrará el controlador de eventos en el bucle de eventos. Cuando el editor envía un mensaje al canal especificado a través del comando PUBLICAR, el servidor Redis enviará el mensaje a todos los oyentes en el controlador de eventos relacionado con el canal, para realizar la publicación y suscripción del mensaje.

1.2 Publicación/suscripción basada en patrones

Redis también es compatible con Pub/Sub basado en patrones, que son canales especiales que pueden coincidir con uno o más canales. En Redis, suscríbase o cancele la suscripción a canales que coincidan con el patrón especificado a través del comando PSUBSCRIBE y reciba mensajes enviados por el editor a través del oyente.

Este es un ejemplo de publicación/suscripción basada en esquemas en la interfaz de línea de comandos de Redis:

# 订阅模式
127.0.0.1:6379> PSUBSCRIBE news.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1

# 发布消息
127.0.0.1:6379> PUBLISH news.world "Hello, world!"
(integer) 1

# 订阅者接收到消息
1) "pmessage"
2) "news.*"
3) "news.world"
4) "Hello, world!"

La publicación/suscripción basada en patrones es similar a la publicación/suscripción basada en canales, excepto que se pueden usar comodines (*) para hacer coincidir varios canales al suscribirse, a fin de lograr una suscripción y un filtrado de mensajes más flexibles.

Específicamente, cuando un cliente se suscribe a un patrón a través del comando PSUBSCRIBE, el servidor de Redis agregará el detector del cliente a todos los controladores de eventos relacionados con el canal que coincide con el patrón y registrará el evento en el procesador de bucle de eventos. Cuando el publicador envía un mensaje al canal que coincide con el patrón a través del comando PUBLICAR, el servidor de Redis enviará el mensaje a todos los oyentes en el controlador de eventos relacionado con el patrón, realizando así la publicación y suscripción de mensajes basados ​​en patrones.

2. Aplicación práctica de Redis publicar y suscribir

2.1 Centinela Redis

Redis Sentinel es una solución de alta disponibilidad para Redis. Cuando el nodo maestro falla, puede promover automáticamente el nodo esclavo al nodo maestro para lograr la conmutación por error. Redis Sentinel utiliza un mecanismo de publicación y suscripción para descubrir nuevos nodos e intercambiar el estado entre los nodos maestros, y los clientes también pueden obtener información sobre el estado de la conmutación por error del nodo maestro al suscribirse a canales específicos.

En Redis Sentinel, cada nodo Sentinel enviará periódicamente mensajes al canal sentinel :hello, y cada nodo Sentinel también se suscribirá a este canal, de modo que una vez que un nodo envíe un mensaje a este canal, otros nodos pueden recibir el mensaje inmediatamente, y Agregue este nodo a la lista de nodos locales. Además, cada vez que se envía un mensaje a este canal, puede contener la información de estado del nodo, que se utilizará como base para la posterior elección del líder Sentinel.

Para el cliente, puede obtener la información de estado de la conmutación por error del nodo maestro suscribiéndose al canal +switch-master. Una vez que Redis Sentinel complete la conmutación por error del nodo principal, publicará el mensaje del nodo principal y el cliente podrá recibir el mensaje y cambiar al nuevo nodo principal a tiempo, lo que garantiza la confiabilidad y disponibilidad del sistema.
inserte la descripción de la imagen aquí

El nodo Redis Sentinel utiliza principalmente el mecanismo de publicación y suscripción para realizar el descubrimiento de nuevos nodos e intercambiar el estado entre los nodos maestros. Como se muestra en la figura anterior, cada nodo Sentinel enviará mensajes regularmente al canal sentinel :hello, y cada Sentinel se suscribirá a este nodo. De esta forma, una vez que un nodo envía un mensaje a este canal, otros nodos pueden recibir el mensaje inmediatamente.
De esta manera, una vez que se une un nuevo nodo, envía un mensaje a este canal, después de que otros nodos lo reciben, juzgan que la lista local no tiene este nodo, por lo que pueden agregarse a la lista de nodos locales como un nuevo nodo. .

Además, cada vez que se envía un mensaje a este canal, se puede incluir el contenido de la información de estado del nodo, que se puede utilizar como base para la elección del líder Sentinel posterior.

Los anteriores son todos para el servidor Redis, y para el cliente, también podemos usar el mecanismo de publicación-suscripción.
Cuando Redis Sentinel realiza la conmutación por error del nodo maestro, cada etapa de este proceso se proporcionará de forma externa a través de la publicación y la suscripción.
Para nuestro cliente, estamos más preocupados por el nodo maestro después del cambio, para que podamos cambiar la conexión del nodo maestro a tiempo (el nodo anterior ha fallado en este momento y ya no puede aceptar instrucciones de operación), el cliente puede suscribirse al canal +switch-master, una vez que
Redis Sentinel publicará el mensaje del nodo maestro después de la conmutación por error del nodo maestro.

2.1 Publicación/suscripción de SpringBoot Redis

En Spring Boot, la función de publicación/suscripción de Redis se puede realizar a través de las clases RedisMessageListenerContainer y RedisTemplate proporcionadas por Spring Data Redis. Los pasos específicos son los siguientes:

  1. Agregue las dependencias de Redis y Spring Data Redis:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. Configure la información de conexión de Redis:
spring.redis.host=localhost
spring.redis.port=6379
  1. Cree instancias de RedisMessageListenerContainer y RedisTemplate:
@Configuration
public class RedisConfig {
    
    
    
    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    @Bean
    public RedisMessageListenerContainer messageListenerContainer() {
    
    
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(redisConnectionFactory);
        return container;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
    
    
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setDefaultSerializer(new StringRedisSerializer());
        return template;
    }
}
  1. Crea un detector de mensajes:
@Component
public class MessageListener implements MessageListenerAdapter {
    
    

    @Override
    public void onMessage(Message message, byte[] pattern) {
    
    
        String msg = (String) redisTemplate().getValueSerializer().deserialize(message.getBody());
        System.out.println("Received message: " + msg);
    }
}
  1. Suscríbete a las noticias:
@Autowired
private RedisMessageListenerContainer container;

@Autowired
private MessageListener listener;

@PostConstruct
public void subscribe() {
    
    
    container.addMessageListener(listener, new PatternTopic("news.*"));
}
  1. Hacer un anuncio:
@Autowired
private RedisTemplate<String, Object> redisTemplate;

public void publish() {
    
    
    redisTemplate.convertAndSend("news.world", "Hello, world!");
}

Cuando se utiliza el modo de publicación/suscripción de Redis, se deben considerar cuestiones como las capacidades de procesamiento simultáneo de los suscriptores, la serialización y deserialización de mensajes para garantizar la confiabilidad y el rendimiento del sistema.

3. Redis de la serie de artículos de entrada a competencia

"Redis de entrada a competencia [Avanzado]: explicación detallada de AOF persistente"
"Redis de entrada a competencia [Avanzado]: explicación detallada de RDB persistente"
"Redis de entrada a competencia [avanzado]: el diccionario de estructura de datos subyacente (Diccionario) Explicación detallada"
"Redis desde el inicio hasta el dominio [artículos de alto nivel] explicación detallada de la estructura de datos subyacente QuickList" "
Redis desde el inicio hasta el dominio [artículos avanzados] explicación detallada de la estructura de datos subyacente Simple Dynamic String (SDS)" "
Redis de entrada a competencia [capítulo avanzado] explicación detallada de la lista de compresión de la estructura de datos subyacente (ZipList)" "
Redis de entrada a competencia [capítulo avanzado] explicación detallada y ejemplos de uso del tipo de datos Stream"

Supongo que te gusta

Origin blog.csdn.net/wangshuai6707/article/details/131520851
Recomendado
Clasificación