Garantía de mensajes de RocketMQ, lectura repetida, trabajo pendiente, secuencia, filtrado, retraso, transacción y uso de mensajes inactivos
¿En qué etapas se pierden los mensajes? Los mensajes se pueden perder en tres etapas: etapa de producción, etapa de almacenamiento y etapa de consumo.
Por lo tanto, piense en términos de estas tres etapas:
En la etapa de producción, garantice la entrega confiable de mensajes El método principal es el mecanismo de confirmación de solicitud.
En la fase de almacenamiento, puede configurar parámetros de Broker con prioridad de confiabilidad para evitar la pérdida de mensajes debido al tiempo de inactividad, lo que simplemente significa que los escenarios de aplicaciones con prioridad de confiabilidad deben usar sincronización
Desde Desde un Desde la perspectiva del consumidor, ¿cómo garantizar que los mensajes se consuman con éxito?
La clave para que los consumidores aseguren un consumo exitoso de los mensajes radica en el tiempo de confirmación. Los consumidores no deben enviar la confirmación de consumo inmediatamente después de recibir el mensaje, sino que deben enviar la confirmación de consumo después de ejecutar toda la lógica empresarial de consumo. Dado que la cola de mensajes mantiene la posición de consumo, si la lógica falla y no hay reconocimiento, regresa a la cola y extrae el mensaje, seguirá siendo el mismo que antes.
Es difícil para las colas de mensajes distribuidos garantizar tanto la entrega determinista como la entrega no repetitiva, la llamada una vez y solo una vez. RocketMQ elige la entrega garantizada, lo que garantiza que los mensajes no se pierdan, pero puede provocar su duplicación.
Para abordar el problema de la duplicación de mensajes, existen dos métodos principales para garantizarlo: la inercia empresarial y la deduplicación de mensajes.
Cuando se produce una acumulación de mensajes, debe encontrar una manera de aprovechar el tiempo para completar el procesamiento del consumo de mensajes pendientes y considerar aumentar la capacidad de consumir mensajes. Generalmente hay dos formas de hacer esto:
La mensajería secuencial significa que el orden de consumo de mensajes es el mismo que el orden de generación de mensajes. En algunos casos, en este caso se debe garantizar el orden, por lo que la lógica empresarial debe realizarse en orden. En alguna lógica empresarial, el pedido debe estar garantizado, como la generación, el pago y el envío del pedido; dichos mensajes deben procesarse para que sean útiles.
Los mensajes secuenciales se dividen en mensajes secuenciales globales y mensajes secuenciales parciales:
Los mensajes secuenciales parciales son relativamente fáciles de implementar y el productor debe poder enviar mensajes con la misma ID. a la misma cola de mensajes Durante el proceso de consumo, los mensajes leídos de la misma cola de mensajes deben procesarse secuencialmente; el consumidor no puede procesar mensajes secuenciales al mismo tiempo. -Los consumidores no pueden procesar mensajes secuenciales al mismo tiempo para lograr pedidos parciales.
El remitente usa la clase MessageQueueSelector para controlar a qué cola de mensajes se envía el mensaje.
El consumidor resuelve el problema del procesamiento simultáneo de mensajes desde una única cola de mensajes usando MessageListenerOrderly. clase. RocketMQ no garantiza el orden de forma predeterminada. Por ejemplo, si crea un tema, hay 8 colas de escritura y 8 colas de lectura de forma predeterminada, y es posible que se escriban mensajes en cualquiera de las colas durante el proceso de lectura de datos. Puede haber más de un consumidor, cada uno de los cuales puede iniciar varios subprocesos para procesar datos en paralelo, por lo que es difícil determinar qué consumidor consumirá los mensajes, el orden en que se consumen los mensajes, el orden en que se escriben los mensajes y el orden. en el que se consumen los mensajes. El orden en que se consumen y escriben los mensajes no está definido.
Para garantizar el orden global de los mensajes, debe establecer el número de colas de lectura y escritura en el Tema en 1 y luego establecer la simultaneidad del Productor Consumidor en 1 también. En resumen, para mantener todo el tema ordenado globalmente, debe eliminar toda la concurrencia y configurar todo en procesamiento de subproceso único, lo que sacrificará las características de alta concurrencia y alto rendimiento de RocketMQ.
Hay dos opciones:
Hay tres formas de filtrar mensajes:
La cancelación automática de pedidos de comercio electrónico a lo largo del tiempo es un ejemplo típico de utilización de mensajes retrasados. mensajes cuando el usuario envía el pedido, envía un mensaje de retraso y luego verifica el estado del pedido después de 1 hora. Si aún no se realiza el pago, cancela el pedido y libera el inventario.
RocketMQ admite mensajes retrasados. Solo necesita establecer el nivel de retraso del mensaje al generar el mensaje:
Sin embargo, actualmente RocketMQ puede admitir un número limitado de niveles de retraso:
p>
Entonces, ¿cómo implementa RocketMQ los mensajes retrasados?
Simple, ocho palabras: almacenamiento temporal de tareas programadas
Cuando el Broker recibe el mensaje retrasado, lo enviará al cola de mensajes del tema (SCHEDULE_TOPIC_XXXX), y luego use tareas programadas para sondear estas colas. Cuando la tarea programada caduque, descartará el mensaje a la cola del tema de destino y el consumidor podrá consumir el mensaje normalmente.
Semiinformación: Son mensajes que los consumidores no pueden consumir temporalmente. El productor envía el mensaje al corredor, pero el mensaje está marcado como no entregable y el consumidor solo puede consumir el mensaje después de que el productor haya completado la transacción local y lo haya reconocido dos veces.
Basándose en semimensajes, puede implementar transacciones de mensajes distribuidos, cuya clave es la confirmación secundaria y el rastreo del mensaje:
RocketMQ implementa transacciones de mensajes:
La cola de mensajes inactivos se utiliza para procesar mensajes que no se pueden consumir normalmente, es decir, cuando el consumo de mensajes falla por primera vez, la cola de mensajes RocketMQ reintentará automáticamente el mensaje cuando el número de reintentos alcance el límite máximo; cola RocketMQ El mensaje se reintentará automáticamente si el consumo aún falla después de que el número de reintentos alcanza el límite máximo, el consumidor no puede consumir el mensaje correctamente en circunstancias normales. En este momento, la cola de mensajes RocketMQ no descartará el mensaje inmediatamente, sino que lo enviará a la cola especial correspondiente al consumidor, es decir, la cola de mensajes no entregados.
Características de los mensajes de mensajes fallidos:
Características de las colas de mensajes fallidos:
Las colas de mensajes fallidos se utilizan para procesar mensajes que no se pueden consumir normalmente, es decir, mensajes de letra muerta.
La consola RocketMQ proporciona las funciones de consultar, exportar y retransmitir mensajes no entregados.
Debido a que NameServer no tiene estado y no se comunica entre sí, se garantiza que tendrá alta disponibilidad siempre que se implemente en un clúster.
La alta disponibilidad de RocketMQ se refleja principalmente en la disponibilidad de lectura y escritura del Broker, que se logra mediante métodos de agrupación y maestro-esclavo.
Esto significa que los productores solo pueden escribir en el Broker en el rol maestro, mientras que los consumidores pueden leer desde el Broker tanto en el rol maestro como en el esclavo.
No es necesario configurar el archivo de configuración del consumidor para leer desde el dispositivo maestro o el dispositivo esclavo; cuando el dispositivo maestro no está disponible o está ocupado, la solicitud de lectura del consumidor cambiará automáticamente para leer desde el dispositivo esclavo; . A través de este mecanismo de cambio automático de consumidores, cuando falla la máquina que desempeña el rol Maestro, el consumidor aún puede leer desde el dispositivo esclavo sin afectar la capacidad del consumidor para leer mensajes, logrando así una alta disponibilidad de lectura.
Cómo lograr alta disponibilidad de escritura en el remitente
Nota: RocketMQ actualmente no admite que el Broker cambie automáticamente del rol de esclavo (Esclavo) al rol de maestro-esclavo (Maestro) Entonces, si la máquina no tiene recursos suficientes y necesita cambiar de la función de esclavo a la función de maestro, entonces debe detener manualmente el Broker en la función de esclavo. Cambie el archivo de configuración e inicie Broker con el nuevo archivo de configuración.