En ApsaraMQ for RocketMQ, la consistencia de suscripciones significa que todas las instancias de consumidor identificadas con el mismo ID de grupo deben estar suscritas a los mismos temas y etiquetas. Las suscripciones inconsistentes pueden provocar errores en la lógica de consumo de mensajes, así como consumos repetidos u omitidos.
¿Qué es la consistencia de suscripciones?
En ApsaraMQ for RocketMQ, un grupo de consumidores es un conjunto de instancias de consumidor. En la mayoría de las aplicaciones distribuidas, varias instancias de consumidor se asignan a un mismo grupo de consumidores.
En ApsaraMQ for RocketMQ, una suscripción hace referencia a la relación entre un grupo de consumidores y un tema específico, lo cual incluye las condiciones utilizadas para filtrar los mensajes dentro del tema suscrito.
Para garantizar la consistencia de las suscripciones, todas las instancias de consumidor identificadas con el mismo ID de grupo deben coincidir en los siguientes aspectos:
-
Los temas a los que se suscriben las instancias de consumidor deben ser consistentes.
Por ejemplo, si el Consumidor 1 está suscrito al Tema A y al Tema B, el Consumidor 2 del mismo grupo también debe estar suscrito al Tema A y al Tema B. El Consumidor 2 no puede suscribirse únicamente al Tema A o al Tema B, ni tampoco al Tema A y al Tema C.
-
Las etiquetas a las que se suscriben las instancias de consumidor dentro del tema deben ser consistentes, tanto en cantidad como en orden.
Por ejemplo, si el Consumidor 1 está suscrito a Tag1||Tag2 en el Tema B, el Consumidor 2 del mismo grupo también debe estar suscrito a Tag1||Tag2 en el Tema B. El Consumidor 2 no puede suscribirse únicamente a Tag1 o a Tag2, ni tampoco a Tag2||Tag1 en el Tema B.
-
Si las instancias de consumidor de un grupo están suscritas a varios temas, el tipo de mensaje de dichos temas debe ser consistente.
Por ejemplo, si el Consumidor 1 y el Consumidor 2 están suscritos al Tema A y al Tema B, ambos temas deben tener el mismo tipo de mensaje, como el tipo de mensaje normal o el tipo de mensaje ordenado. Para obtener información sobre los tipos de mensajes compatibles con ApsaraMQ for RocketMQ, consulte Message types.
La siguiente figura muestra un ejemplo de suscripciones consistentes. Los grupos con diferentes ID están suscritos a distintos temas. Cada grupo contiene las instancias de consumidor C1, C2 y C3. Todas las instancias de consumidor dentro del mismo grupo están suscritas a los mismos temas y etiquetas.
ApsaraMQ for RocketMQ permite utilizar los SDK de cliente TCP y HTTP para enviar y recibir mensajes. Además de garantizar la consistencia de las suscripciones de las instancias de consumidor dentro del mismo grupo, también debe asegurar la coherencia entre la versión del protocolo del grupo de consumidores que recibe los mensajes y la versión del protocolo del SDK. Por ejemplo, si utiliza un SDK de cliente TCP para enviar y recibir mensajes, también debe emplear un grupo de consumidores que use el protocolo TCP para suscribirse a los mensajes. De lo contrario, el consumo de mensajes fallará.
¿Cómo compruebo si las suscripciones de las instancias de consumidor de un grupo son consistentes?
Para comprobar si las suscripciones de las instancias de consumidor de un grupo son consistentes, realice las siguientes operaciones:
Inicie sesión en la consola de ApsaraMQ for RocketMQ. En la página Instances, localice la instancia que desea gestionar y haga clic en su nombre para ir a la página Instance Details.
En el panel de navegación izquierdo, haga clic en Groups. En la página que aparece, haga clic en el nombre del grupo de consumidores que desea gestionar.
En la sección Subscriptions de la página Group Details, compruebe si las suscripciones del grupo de consumidores son consistentes.
Suscripción consistente 1: Una etiqueta en un tema
En la siguiente figura, las instancias de consumidor C1, C2 y C3 pertenecen al mismo grupo. Estas instancias están suscritas a Tag 1 en el Tema A. Este escenario cumple con los requisitos de consistencia de suscripciones.
**
Código de ejemplo de la suscripción consistente 1**
Las suscripciones de C1, C2 y C3 son consistentes. Por lo tanto, el código escrito para que C1, C2 y C3 se suscriban a los mensajes debe ser idéntico. Código de ejemplo:
Properties properties = new Properties();
properties.put(PropertyKeyConst.GROUP_ID, "GID_test_1");
Consumer consumer = ONSFactory.createConsumer(properties);
consumer.subscribe("TopicA", "Tag1", new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
System.out.println(message.getMsgID());
return Action.CommitMessage;
}
});
Suscripción consistente 2: Varias etiquetas en un tema
En la siguiente figura, las instancias de consumidor C1, C2 y C3 pertenecen al mismo grupo. Estas instancias están suscritas a Tag1||Tag2 en el Tema B. De este modo, todas las instancias de consumidor reciben los mensajes con Tag 1 o Tag 2 del Tema B en el mismo orden. Este escenario cumple con los requisitos de consistencia de suscripciones.
**
Código de ejemplo de la suscripción consistente 2**
Las suscripciones de C1, C2 y C3 son consistentes. Por lo tanto, el código escrito para que C1, C2 y C3 se suscriban a los mensajes debe ser idéntico. Código de ejemplo:
Properties properties = new Properties();
properties.put(PropertyKeyConst.GROUP_ID, "GID_test_2");
Consumer consumer = ONSFactory.createConsumer(properties);
consumer.subscribe("TopicB", "Tag1||Tag2", new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
System.out.println(message.getMsgID());
return Action.CommitMessage;
}
});
Suscripción consistente 3: Varias etiquetas en varios temas
En la siguiente figura, las instancias de consumidor C1, C2 y C3 pertenecen al mismo grupo. Estas instancias están suscritas al Tema A y al Tema B. No se especifican etiquetas para el Tema A, mientras que para el Tema B se define Tag1||Tag2. En este caso, las instancias de consumidor reciben todos los mensajes del Tema A y los mensajes con Tag 1 o Tag 2 del Tema B en el mismo orden. Este escenario cumple con los requisitos de consistencia de suscripciones.
**
Código de ejemplo de la suscripción consistente 3**
Las suscripciones de C1, C2 y C3 son consistentes. Por lo tanto, el código escrito para que C1, C2 y C3 se suscriban a los mensajes debe ser idéntico. Código de ejemplo:
Properties properties = new Properties();
properties.put(PropertyKeyConst.GROUP_ID, "GID_test_3");
Consumer consumer = ONSFactory.createConsumer(properties);
consumer.subscribe("TopicA", "*", new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
System.out.println(message.getMsgID());
return Action.CommitMessage;
}
});
consumer.subscribe("TopicB", "Tag1||Tag2", new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
System.out.println(message.getMsgID());
return Action.CommitMessage;
}
});
Suscripciones inconsistentes
Usted utiliza ApsaraMQ for RocketMQ para enviar y recibir mensajes. Sin embargo, las instancias de consumidor no reciben los mensajes como se esperaba y las suscripciones mostradas en la consola de ApsaraMQ for RocketMQ presentan inconsistencias. Esto puede deberse a alguno de los siguientes problemas en las instancias de consumidor:
Suscripción inconsistente 1: Instancias de consumidor del mismo grupo suscritas a diferentes temas
En la siguiente figura, las instancias de consumidor C1, C2 y C3 pertenecen al mismo grupo, pero están suscritas a temas distintos. C1 está suscrito al Tema A, C2 al Tema B y C3 al Tema C. Este escenario no cumple con los requisitos de consistencia de suscripciones.
Suscripción inconsistente 2: Instancias de consumidor del mismo grupo suscritas a diferentes etiquetas en el mismo tema
En la siguiente figura, las instancias de consumidor C1, C2 y C3 pertenecen al mismo grupo y están suscritas al Tema A. Sin embargo, C1 está suscrito a Tag 1 en el Tema A, mientras que C2 y C3 están suscritos a Tag 2 en el mismo tema. Dado que las instancias de consumidor están suscritas a etiquetas distintas dentro del mismo tema, este escenario no cumple con los requisitos de consistencia de suscripciones.

Suscripción inconsistente 3: Instancias de consumidor del mismo grupo suscritas al mismo tema y a las mismas etiquetas, pero especificadas en diferente orden
En la siguiente figura, las instancias de consumidor C1, C2 y C3 pertenecen al mismo grupo y están suscritas al Tema A y al Tema B. No se especifican etiquetas para el Tema A, mientras que para el Tema B se definen Tag 1 y Tag 2. Sin embargo, C1 está suscrito a Tag1||Tag2 en el Tema B, mientras que C2 y C3 están suscritos a Tag2||Tag1 en el mismo tema. Este escenario no cumple con los requisitos de consistencia de suscripciones.

Preguntas frecuentes
¿Puede un grupo de consumidores suscribirse a varios temas?
Sí, un grupo de consumidores puede suscribirse a varios temas. Cuando un grupo de consumidores se suscribe a un tema específico, se establece una suscripción. Asegúrese de que todas las instancias de consumidor dentro del grupo estén suscritas a dicho tema.
¿Puedo eliminar una suscripción desde la consola de ApsaraMQ for RocketMQ?
No, no es posible eliminar una suscripción directamente desde la consola de ApsaraMQ for RocketMQ. Debe eliminar la suscripción configurando el parámetro correspondiente en el código del cliente.
