RabbitMQ de entrada a avanzado (cola de retraso inicial)

¡Acostúmbrate a escribir juntos! Este es el día 16 de mi participación en el "Desafío de actualización de abril del nuevo plan diario de Nuggets", haga clic para ver los detalles del evento .

Siete, cola de retraso

7.1 Concepto de cola de retraso

Cola de retraso, el interior de la cola está ordenado, y la característica más importante se refleja en su atributo de retraso.Se espera que los elementos en la cola de retraso se saquen y procesen después o antes del tiempo especificado.En resumen, retrasar una cola es una cola utilizada para almacenar elementos que deben procesarse en un momento específico.

7.2 Escenarios de uso de colas retrasadas

  1. Si el pedido no se paga en diez minutos, se cancelará automáticamente

  2. Para las tiendas recién creadas, si no se han subido productos dentro de los diez días, se enviará automáticamente un mensaje de recordatorio.

  3. Después de que el usuario se haya registrado con éxito, si el usuario no inicia sesión dentro de los tres días, se enviará un recordatorio por SMS.

  4. El usuario inicia un reembolso, y si no se procesa dentro de los tres días, se notificará al operador correspondiente.

  5. Después de programar la reunión, cada participante debe ser notificado diez minutos antes de la hora programada para participar en la reunión.

Estos escenarios tienen la característica de que una determinada tarea debe completarse en un momento específico después o antes de que ocurra un evento .

Por ejemplo: cuando ocurre un evento de generación de pedidos, verifique el estado de pago del pedido después de diez minutos y luego cierre el pedido sin pagar; parece usar una tarea cronometrada, sondear los datos todo el tiempo, verificarlos cada segundo y tomar los datos que necesitan ser procesados ​​y luego se acabó, ¿no es así?

Si la cantidad de datos es relativamente pequeña, esto sí se puede hacer. Por ejemplo, para el requisito de "liquidación automática si la factura no se paga dentro de una semana", si el tiempo no está estrictamente limitado, pero una semana en un suelto sentido, luego ejecute todas las noches.Un trabajo cron para verificar todas las facturas impagas es de hecho una opción viable. Sin embargo, para escenarios con una cantidad relativamente grande de datos y gran puntualidad,

Por ejemplo: "Cierre el pedido si no se paga dentro de diez minutos", puede haber una gran cantidad de datos de pedidos sin pagar en el corto plazo, e incluso puede alcanzar el nivel de un millón o incluso diez millones durante el evento. Es obvio que el método de sondeo todavía se usa para una cantidad de datos tan grande, no es recomendable, es muy probable que las comprobaciones de todas las órdenes no se puedan completar en un segundo y, al mismo tiempo, pondrá mucho de presión sobre la base de datos, incapaz de cumplir con los requisitos comerciales y bajo rendimiento.

7.3 Configuración de cola TTL

¿Qué es TTL? TTL es un atributo de un mensaje o cola en RabbitMQ, que indica el tiempo máximo de supervivencia de un mensaje o todos los mensajes en la cola, en milisegundos.

En otras palabras, si un mensaje tiene un atributo TTL establecido o ingresa a una cola con un atributo TTL establecido, el mensaje se convertirá en una "letra muerta" si no se consume dentro del tiempo establecido por el TTL. **Si se configuran tanto el TTL de la cola como el TTL del mensaje, se utilizará el valor más pequeño. Hay dos formas de configurar el TTL.

7.3.1 Configuración de cola TTL

Establezca la propiedad "x-message-ttl" de la cola al crear la cola

imagen-20220316103009860

7.3.2 Configuración de mensajes TTL

es establecer TTL para cada mensaje

imagen-20220316103119220

Si se establece la propiedad TTL de la cola, una vez que caduque el mensaje, la cola lo descartará (si la cola de mensajes fallidos está configurada para ser arrojada a la cola de mensajes fallidos), y en el segundo método, incluso si el el mensaje caduca, no necesariamente se descartará de inmediato. Descartar, porque el mensaje caduca se determina antes de que esté a punto de entregarse al consumidor. Si hay una acumulación grave de mensajes en la cola actual, el mensaje caducado puede sobrevivir durante mucho tiempo; además, debe tenerse en cuenta que si el TTL no está configurado, significa que el mensaje nunca caducará.Si el TTL está configurado en 0, significa que el mensaje se descartará a menos que pueda ser directamente entregado al consumidor en este momento.

TTL acaba de ser introducido. Hasta ahora, se han recopilado los dos elementos del uso de RabbitMQ para realizar la cola de demora. A continuación, solo necesita integrarlos y agregar un poco de condimento, y la cola de demora se puede lanzar de nuevo. Piénselo, == cola de demora, ¿no es solo cuánto tiempo desea que se retrase el mensaje para ser procesado? TTL es suficiente para que el mensaje se convierta en letra muerta después de la demora ==, por otro lado, el El mensaje que se convierte en mensaje fallido se entregará a En la cola de mensajes fallidos, el consumidor solo necesita seguir consumiendo los mensajes en la cola de mensajes fallidos, porque todos los mensajes que contiene son mensajes que desean procesarse de inmediato.

7.4 Integrar SpringBoot

7.4.1 Agregar dependencias

<dependencies>
   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <!--RabbitMQ 依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.47</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <!--swagger-->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>3.0.0</version>
    </dependency>
    <!--RabbitMQ 测试依赖-->
    <dependency>
        <groupId>org.springframework.amqp</groupId>
        <artifactId>spring-rabbit-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
复制代码

7.4.2 Modificar el archivo de configuración

spring:
  rabbitmq:
    host: 192.168.42.96
    port: 5672
    username: admin
    password: 123
复制代码

7.4.3 Agregar clase de configuración Swagger

package com.caq.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket webApiConfig() {

        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("webApi")
                .apiInfo(webApiInfo())
                .select()
                .build();
    }

    private ApiInfo webApiInfo() {
        return new ApiInfoBuilder()
                .title("rabbitmq 接口文档")
                .description("本文档描述了 rabbitmq 微服务接口定义")
                .version("1.0")
                .contact(new Contact("enjoy6288", "http://[email protected]", "[email protected]"))
                .build();
    }
}

复制代码

Supongo que te gusta

Origin juejin.im/post/7086991917367443463
Recomendado
Clasificación