Los mensajes ordenados permiten a los consumidores procesar los mensajes exactamente en el mismo orden en que se enviaron. ApsaraMQ for RocketMQ utiliza grupos de mensajes para delimitar el orden: los mensajes dentro del mismo grupo siempre se entregan de forma secuencial, mientras que los mensajes de grupos distintos se procesan de manera independiente.
Casos de uso
Utilice mensajes ordenados cuando los sistemas posteriores deban procesar eventos en la secuencia exacta en que ocurrieron en el sistema anterior:
-
Emparejamiento de operaciones -- En el mercado de valores, cuando varias ofertas comparten el mismo precio, se aplica la regla de primera oferta, primera operación. El sistema de procesamiento de órdenes debe gestionar las ofertas en la secuencia exacta en que se colocaron.

-
Sincronización incremental de datos -- Al replicar cambios de base de datos (inserciones, actualizaciones, eliminaciones) a través de una cola de mensajes hacia un sistema de búsqueda, las operaciones deben reproducirse en el orden original. Una reproducción desordenada genera un estado inconsistente.


Funcionamiento del ordenamiento
El ordenamiento de mensajes de extremo a extremo consta de dos partes: orden de producción (lado del envío) y orden de consumo (lado de la recepción). Ambas condiciones deben cumplirse para garantizar un procesamiento estricto de tipo primero en entrar, primero en salir (FIFO).
Orden de producción
Para garantizar el orden de producción, cumpla las tres condiciones siguientes:
Mismo grupo de mensajes -- Establezca el mismo grupo de mensajes para todos aquellos que deban ordenarse entre sí. Los mensajes pertenecientes a grupos diferentes no tienen relación de orden.
Productor único -- Envíe todos los mensajes relacionados desde un solo productor. Aunque pertenezcan al mismo grupo de mensajes, los mensajes provenientes de distintos productores en sistemas diferentes carecen de un orden determinista.
Envío serial -- Envíe los mensajes de forma secuencial desde un solo hilo. El cliente del productor admite acceso multihilo, pero los mensajes enviados en paralelo desde hilos distintos no tienen un orden determinista.
Cuando se cumplen estas condiciones, los mensajes del mismo grupo se almacenan en la misma cola siguiendo el orden de envío.

Comportamiento de almacenamiento:
Los mensajes del mismo grupo se almacenan de forma secuencial en la misma cola.
Los mensajes de grupos diferentes pueden coexistir en la misma cola, pero su orden relativo no está garantizado.
En el diagrama anterior, el Grupo de mensajes 1 (G1-M1, G1-M2, G1-M3) y el Grupo de mensajes 4 (G4-M1, G4-M2) comparten la Cola 1. ApsaraMQ for RocketMQ garantiza el orden dentro de cada grupo, pero no entre grupos distintos.
Orden de consumo
Para garantizar el orden de consumo, dos mecanismos trabajan en conjunto:
-
Orden de entrega -- El protocolo del SDK y del servidor entrega los mensajes según el orden de almacenamiento. Siga estrictamente el patrón de recibir-procesar-confirmar. El procesamiento asíncrono puede romper la garantía de orden.
ImportanteCon PushConsumer, los mensajes se entregan uno por uno siguiendo el orden de almacenamiento. Con SimpleConsumer, pueden llegar varios mensajes en una sola extracción; su aplicación debe procesarlos de forma secuencial y confirmar cada uno antes de llamar nuevamente a
receivepara el mismo grupo. Para más detalles, consulte Consumer types. -
Reintentos limitados -- Cuando un mensaje ordenado falla tras alcanzar el número máximo de reintentos, se omite para desbloquear los mensajes subsiguientes. Elija una cantidad de reintentos que equilibre la fiabilidad con el riesgo de bloquear todo el grupo. Los reintentos dentro de un grupo de mensajes:
No alteran la garantía de orden.
No afectan a los mensajes de otros grupos.
Sí bloquean los mensajes subsiguientes del mismo grupo hasta que se resuelva el mensaje actual.
ImportanteMientras se reintenta un mensaje ordenado fallido, los mensajes subsiguientes del mismo grupo permanecen bloqueados. Estos se entregan únicamente después de que el mensaje actual se procese correctamente o agote sus reintentos.
Combinaciones de orden de producción y consumo
El modo FIFO estricto requiere tanto orden de producción como de consumo. Sin embargo, no todos los consumidores necesitan entrega ordenada. Combine las opciones según sus requisitos de rendimiento y ordenamiento:
|
Orden de producción |
Orden de consumo |
Resultado |
|
Grupo de mensajes configurado; envío serial |
Ordenado |
FIFO estricto dentro de cada grupo de mensajes |
|
Grupo de mensajes configurado; envío serial |
Concurrente |
Orden cronológico con mejor esfuerzo; mayor rendimiento |
|
Sin grupo de mensajes; envío desordenado |
Ordenado |
Orden estricto a nivel de cola (coincide con el orden de almacenamiento, no con el de envío) |
|
Sin grupo de mensajes; envío desordenado |
Concurrente |
Orden cronológico con mejor esfuerzo |
Ciclo de vida del mensaje
Un mensaje ordenado pasa por cinco estados:

Inicializado -- El productor construye el mensaje y prepara su envío.
Listo -- El mensaje llega al broker y se vuelve visible para los consumidores.
En tránsito -- Un consumidor recupera el mensaje y lo procesa. Si el broker no recibe confirmación dentro del tiempo de espera, reintenta la entrega. Para más detalles, consulte Reintento de consumo.
Confirmado -- El consumidor confirma el resultado. De forma predeterminada, ApsaraMQ for RocketMQ conserva todos los mensajes. El broker marca el mensaje como consumido, pero no lo elimina de inmediato.
Eliminado -- Cuando expira el periodo de retención o el almacenamiento escasea, el broker elimina los mensajes más antiguos de forma rotativa. Antes de la eliminación, los mensajes pueden volver a consumirse. Para más detalles, consulte Almacenamiento y limpieza de mensajes.
Un mensaje reintentado se trata como un mensaje nuevo. El ciclo de vida del mensaje original finaliza.
Mientras se reintenta un mensaje ordenado, los mensajes subsiguientes del mismo grupo permanecen bloqueados hasta que el mensaje actual se procese correctamente.
Límites
Los mensajes ordenados solo pueden enviarse a temas cuyo MessageType esté configurado como FIFO. El tipo de mensaje debe coincidir con el tipo del tema.
Si un grupo de consumidores está configurado para entrega ordenada, todos los mensajes consumidos por ese grupo se facturan como mensajes ordenados, independientemente de su tipo real. Si no requiere un orden estricto, configure el grupo para entrega concurrente y reduzca costos.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Un tema con MessageType configurado como FIFO, creado en la consola de ApsaraMQ for RocketMQ
Un grupo de consumidores configurado para entrega ordenada (obligatorio solo si necesita consumo ordenado)
El RocketMQ 5.x gRPC SDK instalado en su proyecto
Los mensajes ordenados solo pueden enviarse a temas cuyo MessageType esté configurado como FIFO. Un grupo de consumidores que no esté configurado en modo de entrega ordenada entregará los mensajes de forma concurrente. Compruebe tanto el tipo de tema como el modo de entrega del grupo de consumidores antes de escribir cualquier código.
Optimización de la concurrencia de consumo
Con el RocketMQ 5.x gRPC SDK, PushConsumer puede distribuir mensajes de la misma MessageQueue a diferentes hilos según su grupo de mensajes. Cuanto mayor sea la variedad de valores en sus grupos de mensajes, mayor será la mejora en el rendimiento.
Versiones de SDK compatibles:
|
SDK |
Versión mínima |
|
Java |
5.0.8 |
|
C++ |
5.0.3 |
|
Otros SDK |
No compatible |
Envío y consumo de mensajes ordenados
Los mensajes ordenados requieren un grupo de mensajes en cada llamada de envío. Diseñe los grupos de mensajes con la granularidad más fina que permita su negocio; por ejemplo, utilice un ID de pedido o un ID de usuario. Esto permite mantener el orden por entidad y maximizar el paralelismo entre entidades distintas.
Todos los ejemplos siguientes utilizan Java. Para ver muestras completas del SDK en otros lenguajes, consulte RocketMQ 5.x gRPC SDK.
Código de ejemplo
Solución de problemas de reintentos de consumo
Los reintentos de consumo ordenado para PushConsumer ocurren en el lado del cliente; el servidor no registra los detalles del reintento. Si el rastreo de un mensaje muestra un resultado de entrega failed, revise los registros del cliente consumidor.
Para consultar la ruta de los registros del cliente, véase Configuración de registros.
Busque las siguientes palabras clave en los registros del cliente:
Message listener raised an exception while consuming messages
Failed to consume fifo message finally, run out of attempt times
Mejores prácticas
Procese mensajes de forma serial, no por lotes
Consuma un mensaje a la vez. El consumo por lotes puede romper el orden.
Ejemplo: Los mensajes se envían en el orden 1 -> 2 -> 3 -> 4. Durante el consumo por lotes, los mensajes 2 y 3 se procesan juntos y fallan. Al reintentar, tanto el 2 como el 3 se vuelven a entregar, pero el mensaje 2 podría procesarse nuevamente después de que el mensaje 3 ya se haya procesado correctamente en otro intento, lo que resulta en un consumo desordenado.
Distribuya los grupos de mensajes para evitar puntos críticos
ApsaraMQ for RocketMQ utiliza el valor del grupo de mensajes para determinar en qué cola del servidor se almacena cada mensaje. Todos los mensajes del mismo grupo se enrutan a la misma cola. Concentrar demasiados mensajes en pocos grupos sobrecarga esas colas, crea puntos críticos de almacenamiento y limita la escalabilidad.
Utilice claves detalladas como grupos de mensajes; por ejemplo, IDs de pedidos o IDs de usuarios. Cuanto mayor sea la variedad de valores en sus grupos de mensajes, más uniforme será la distribución de mensajes entre las colas. Esto mantiene el orden de los mensajes para la misma entidad y distribuye la carga entre colas para entidades diferentes.