Cola de mensajes y cola de mensajes retrasados

Escenarios de aplicación

1. Aumento de los productos básicos

Las solicitudes explosivas de los usuarios ocurren en un corto período de tiempo. Si no se toman las medidas pertinentes, el servidor se verá abrumado y el problema del tiempo de espera de respuesta conducirá a falsas muertes en el servicio y, en el peor de los casos, el servidor dejará de funcionar directamente.

En este momento, se agrega una cola de mensajes. Una vez que el servidor recibe todas las solicitudes del usuario, primero escribe todas estas solicitudes en la cola de mensajes y luego las pone en cola para su procesamiento, de modo que no provoque que se procesen varias solicitudes en al mismo tiempo; si la longitud de la cola de mensajes excede el número máximo que se puede transportar, entonces podemos abandonar la solicitud del usuario actual y notificar al usuario de front-end que "la página ha salido mal, actualice" y otras indicaciones, de modo que habrá una mejor experiencia interactiva.

2. Desacoplamiento del sistema

Después de usar la cola de mensajes, podemos modularizar las funciones comerciales del sistema y realizar el desacoplamiento del sistema.

Los requisitos del producto cambian constantemente. En este momento, pensamos en usar colas de mensajes para lograr el desacoplamiento del sistema. La realización de cada función es independiente, y solo se necesita un interruptor de suscripción o cancelación de suscripción. Cuando necesita agregar una función, usted Solo necesita abrirlo. Simplemente suscríbase a la cola de "información completa del usuario". Si no lo usa en dos días, simplemente apague el interruptor de suscripción.

3. Registro

Práctica general: solicitud del usuario- (procesamiento de la solicitud del usuario, registro de grabación (para completar)) - respuesta a la recepción

Utilizar la cola de mensajes: solicitud del usuario - procesamiento de la solicitud del usuario - poner en la cola de mensajes, responder directamente a la recepción

Middleware de mensajería-RabbitMQ

En la actualidad, los middleware MQ (Message Queue) más utilizados en el mercado son RabbitMQ, Kafka, RocketMQ. Si se trata de una cola de mensajes ligera, puede utilizar la cola de mensajes proporcionada por Redis.

Conceptos importantes

Productor: el creador del mensaje, responsable de crear y enviar datos al servidor.

Consumidor: el destinatario del mensaje, utilizado para procesar datos y confirmar el mensaje.

Agente: El servicio RabbitMQ en sí mismo, se utiliza para desempeñar el papel de "expreso", porque no produce mensajes por sí mismo, sino que solo desempeña el papel de "expreso", almacenando y transmitiendo mensajes temporalmente.

Diagrama de flujo de procesamiento

Inserte la descripción de la imagen aquí

ventaja:

Admite persistencia, RabbitMQ admite la función de persistencia de disco para garantizar que los mensajes no se pierdan;
alta concurrencia, RabbitMQ utiliza el lenguaje de desarrollo Erlang, Erlang es un lenguaje desarrollado para centrales telefónicas, nace con un anillo de luz paralelo alto y características de alta disponibilidad;
distribución de soporte Debido a la implementación del lenguaje Erlang, la implementación del clúster de RabbitMQ también es muy simple. Solo necesita iniciar cada nodo y usar --link para agregar el nodo al clúster, y RabbitMQ admite la selección maestra automática y la recuperación automática de desastres; admite
varios idiomas , como Java, .NET, PHP, Python, JavaScript, Ruby, Go, etc.;
admite la confirmación del mensaje, admite la confirmación del consumo de mensajes (ack) para garantizar que cada mensaje se pueda consumir normalmente;
admite muchos complementos, como como páginas web Para complementos de administración de mensajes de consola, complementos de retardo de mensajes, etc., RabbitMQ tiene muchos complementos y es muy conveniente de usar.

Tipo de mensaje:

modo directo (tipo predeterminado), este modo es un modo de envío uno a uno, es decir, un mensaje solo se enviará a un consumidor; el
modo de encabezados le permite hacer coincidir el encabezado del mensaje en lugar de la clave de enrutamiento ( RoutingKey), además El uso de encabezados y directo es exactamente el mismo, pero debido a que el rendimiento de la coincidencia de encabezados es muy pobre, casi nunca se usa; el
modo fanout, que es un método de multidifusión, distribuirá un mensaje a todos los suscriptores;
modo de tema, que es patrón de suscripción de tema, los comodines (#, *) pueden hacer coincidir uno o más mensajes. Puedo usar "cn.mq. #" para hacer coincidir varios mensajes con el prefijo "cn.mq.xxx", para Por ejemplo, puede coincidir con "cn. mq.rabbit", "cn.mq.kafka" y otros mensajes.

Cola de mensajes personalizados

Podemos usar Queue para implementar colas de mensajes. Las colas se pueden dividir aproximadamente en las siguientes tres categorías:

Deque

Es una subclase de Queue y una clase suplementaria de Queue. La cabecera y la cola admiten la inserción y adquisición de elementos.

Cola de bloqueo se refiere a la operación del elemento (agregar o eliminar), si no tiene éxito, bloqueará la espera de ejecución. Por ejemplo, al agregar un elemento, si el elemento de la cola está lleno, la cola se bloqueará y esperará hasta que haya un espacio para insertar; la
cola sin bloqueo, a diferencia de la cola de bloqueo, devolverá directamente el resultado de la operación, en lugar de bloquear la operación de espera, deque también pertenece a la cola sin bloqueo.

Bloque de código de cola de mensajes personalizado

import java.util.LinkedList;
import java.util.Queue;

public class CustomQueue {
    
    
    private static Queue<String> queue=new LinkedList<>();

    public static void main(String[] args) {
    
    
        producer();
        consumer();
    }
    //生产者
    public static void producer(){
    
    
        queue.add("first-message");
        queue.add("second-message");
        queue.add("third-message");
    }
    //消费者
    public static void consumer(){
    
    
        while (!queue.isEmpty())
        {
    
    
            System.out.println(queue.poll());
        }
    }
}

primer mensaje
segundo mensaje
tercer mensaje

Cola de retraso personalizada

import lombok.Getter;
import lombok.Setter;

import java.text.DateFormat;
import java.util.Date;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class CustomDelayQueue {
    
    
    private static DelayQueue queue=new DelayQueue();

    public static void main(String[] args) throws InterruptedException {
    
    
        producer();
        consumer();
    }
    //生产者
    public static void producer(){
    
    
        queue.add(new MyDelay(3000,"first-message"));
        queue.add(new MyDelay(1000,"second-message"));

    }
    //消费者
    public static void consumer() throws InterruptedException {
    
    
        System.out.println("开始执行时间:"+DateFormat.getDateTimeInstance().format(new Date()));
        while (!queue.isEmpty())
        {
    
    
            System.out.println(queue.take());
        }
        System.out.println("结束执行时间:"+DateFormat.getDateTimeInstance().format(new Date()));
    }
    //

    static class MyDelay implements Delayed{
    
    
        long delayTime=System.currentTimeMillis();

        @Getter
        @Setter
        private String msg;

        public MyDelay(long delayTime,String msg)
        {
    
    
            this.delayTime=(this.delayTime+delayTime);
            this.msg=msg;
        }

        @Override
        public long getDelay(TimeUnit unit) {
    
    
            return unit.convert(delayTime-System.currentTimeMillis(),TimeUnit.MILLISECONDS);
        }

        @Override
        public int compareTo(Delayed o) {
    
    
           if(this.getDelay(TimeUnit.MILLISECONDS)>o.getDelay(TimeUnit.MILLISECONDS))
               return 1;
           else if(this.getDelay(TimeUnit.MILLISECONDS)<o.getDelay(TimeUnit.MILLISECONDS))
               return -1;
           else return 0;
        }

        @Override
        public String toString() {
    
    
            return this.msg;
        }
    }
}

Hora de inicio de ejecución: 2020-12-28 19:41:20
Segundo mensaje Tiempo de finalización del
primer mensaje
: 2020-12-28 19:41:23

Supongo que te gusta

Origin blog.csdn.net/tangshuai96/article/details/111874370
Recomendado
Clasificación