Código fuente de mensajes secuenciales de Rocketmq
Entonces debemos considerar estas tres etapas:
En la etapa de producción, la transmisión confiable de mensajes se garantiza principalmente a través del mecanismo de confirmación de solicitud.
En la fase de almacenamiento, al configurar parámetros de proxy que prioricen la confiabilidad, puede evitar la pérdida de mensajes debido al tiempo de inactividad. En pocas palabras, la sincronización debe usarse en todos los escenarios en los que la confiabilidad es lo primero.
Desde la perspectiva del consumidor, ¿cómo garantizar que los mensajes se consuman correctamente?
La clave para que los consumidores garanticen un consumo exitoso de información reside en el momento de la confirmación. No envíe la confirmación de consumo inmediatamente después de recibir el mensaje, envíe la confirmación de consumo después de ejecutar toda la lógica empresarial de consumo. Debido a que la cola de mensajes mantiene la posición de consumo, la ejecución lógica falla y el mensaje se extrae de la cola sin confirmación, que es lo mismo que antes.
Para las colas de mensajes distribuidos, es difícil garantizar una entrega segura y no duplicada al mismo tiempo, lo que se denomina una vez por todas. RocketMQ ha optado por garantizar una entrega segura y garantizar que los mensajes no se pierdan, pero esto puede causar duplicación de mensajes.
Hay dos formas principales de abordar la duplicación de mensajes: idempotencia empresarial y deduplicación de mensajes.
Las noticias están atrasadas. En este momento, debe encontrar formas de consumir rápidamente la acumulación de noticias y debe considerar mejorar su capacidad de consumo. Generalmente hay dos formas:
Los mensajes secuenciales significan que el orden de consumo y el orden de generación de los mensajes son los mismos. Según cierta lógica empresarial, los pedidos deben estar garantizados, como la generación, el pago y la entrega de los pedidos. Este mensaje debe procesarse en orden.
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 extremo de producción debe enviar mensajes con el mismo ID al misma cola de mensajes. Durante el proceso de consumo, los mensajes leídos de la misma cola de mensajes deben procesarse de forma secuencial; los consumidores no pueden procesar mensajes secuenciales al mismo tiempo, logrando así un pedido parcial.
El remitente utiliza la clase MessageQueueSelector para controlar a qué cola de mensajes se envía el mensaje.
Los consumidores utilizan messagelistener de manera ordenada para resolver el problema del procesamiento concurrente de mensajes en una sola cola de mensajes.
RocketMQ no garantiza el orden de forma predeterminada. Por ejemplo, cuando crea un tema, hay ocho colas de escritura y ocho colas de lectura de forma predeterminada. En este punto, los mensajes se pueden escribir en cualquier cola. Durante el proceso de lectura de datos, puede haber varios consumidores y cada consumidor también puede iniciar varios subprocesos para el procesamiento paralelo. Por lo tanto, no se sabe con certeza qué consumidor consumió el mensaje y si el orden de consumo es coherente con el orden del escritor. .
Para garantizar el orden global de los mensajes, primero se debe establecer en 1 el número de colas de lectura y escritura del tema, y luego la configuración de concurrencia del productor y el consumidor también se debe establecer en 1. En pocas palabras, para garantizar el orden de los mensajes globales de todo el tema, solo se puede excluir todo el procesamiento concurrente y configurar todas las partes para el procesamiento de un solo subproceso. En este momento, la alta concurrencia y el alto rendimiento de RocketMQ son completamente. sacrificado.
Hay dos opciones:
Hay tres formas de filtrar correos electrónicos:
La cancelación automática de pedidos de comercio electrónico a lo largo del tiempo es típica del uso de mensajes retrasados, ejemplo . Cuando los usuarios envían un pedido, pueden enviar un mensaje de retraso y verificar el estado del pedido después de 1 hora. Si aún no se realiza el pago, el pedido se puede cancelar y liberar el inventario.
RocketMQ admite mensajes retrasados. Solo necesita establecer el nivel de retraso del mensaje al generar el mensaje:
Pero el nivel de retraso admitido actualmente por RocketMQ es limitado:
Entonces RocketMQ es ¿Cómo implementar mensajes retrasados?
Simple, ocho palabras: almacenamiento temporal de tareas programadas
Cuando el agente recibe un mensaje retrasado, primero lo enviará a la cola de mensajes del período de tiempo correspondiente al tema ( SCHEDULE_TOPIC_XXXX) y luego sondear estas colas a través de tareas programadas.
Después del vencimiento, publica el mensaje en la cola del tema de destino y el consumidor puede consumir los mensajes normalmente.
Seminoticias: se refiere a noticias que los consumidores no pueden consumir temporalmente. El generador envió correctamente el mensaje al intermediario, pero el mensaje se marcó como no entregable temporalmente. Sólo después de que el productor complete la transacción local y se reconozca por segunda vez, el consumidor podrá consumir el mensaje.
Con base en semimensajes, se pueden realizar transacciones de mensajes distribuidos. La clave está en la confirmación secundaria y el seguimiento del mensaje:
RocketMQ implementa transacciones de mensajes:
El La cola de mensajes no entregados se utiliza para manejar mensajes que no se pueden consumir normalmente, es decir, mensajes de mensajes no entregados.
Cuando un mensaje no se puede consumir por primera vez, la cola de mensajes RocketMQ reintentará automáticamente el mensaje después de alcanzar el número máximo de reintentos. Si el consumo aún falla, significa que 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, que se denomina cola de mensajes no entregados.
Características de los mensajes de mensajes no entregados:
Características de las colas de mensajes no entregados:
La consola RocketMQ proporciona las funciones de consultar, exportar y reenviar mensajes de mensajes no entregados.
Los NameServers no tienen estado y no se comunican entre sí, por lo que se puede lograr una alta disponibilidad siempre que se implementen en un clúster.
La alta disponibilidad de RocketMQ se refleja principalmente en la alta disponibilidad de lectura y escritura del Broker, que se implementa mediante agrupación y maestro-esclavo.
En otras palabras, el productor puede hacerlo. Solo escriba mensajes al agente en el rol maestro, los consumidores pueden leer mensajes de agentes en el rol maestro y esclavo.
En el archivo de configuración del usuario, no es necesario establecer si leer desde el host o el esclavo. Cuando el dispositivo maestro no está disponible o está ocupado, la solicitud de lectura del consumidor cambiará automáticamente al dispositivo esclavo. Con el mecanismo de conmutación automática del lado del consumidor, cuando falla una máquina con la función maestra, el lado del consumidor aún puede leer mensajes de la máquina esclava, lo que no afecta la lectura de mensajes del lado del consumidor, logrando una alta disponibilidad de lectura.
Cómo lograr escritura de alta disponibilidad en el remitente
Nota: RocketMQ actualmente no admite que Broker convierta automáticamente el esclavo en maestro. Si los recursos de la máquina son insuficientes y es necesario convertir el esclavo en el agente maestro, debe detener manualmente el agente con el color del esclavo, cambiar el archivo de configuración e iniciar el agente con el nuevo archivo de configuración.