SpringCloudStream integra RabbitMQ y utiliza ttl+ dead letter para realizar la práctica de la cola de retraso

Este artículo trata sobre la cola de retraso implementada mediante el uso de Spring Cloud Steam para operar RabbitMQ usando la cola de mensajes fallidos ttl+.

prefacio

En el proyecto de la empresa, me encontré con la necesidad de una cola de demora. Para futuros requisitos de mantenibilidad y escalabilidad, se debe usar el componente Springcloud Stream para operar mq, y el conejo de la empresa no permite la instalación de complementos de demora, solo los más ttl original + carta muerta para lograr, encontró muchos problemas en el proceso de construcción y finalmente se implementó con éxito, el siguiente es el código, usando la programación funcional después de spring cloud steam3.1.

Primero, popularicemos el principio: el productor envía un mensaje a un conmutador ordinario y vincula una cola con una configuración de tiempo ttl. Esta cola está vinculada a un conmutador de mensajes fallidos y nadie la consume. Si el mensaje caduca, se enviará a la cola de mensajes fallidos Los consumidores solo escuchan esta cola de mensajes fallidos para lograr el efecto de la cola de retraso.

archivo de configuración yaml

La definición en función es definir el nombre de su función (el nombre del método de envío y recepción más adelante)

xxx-in/out-0 en enlaces se divide en tres partes. La primera parte es el nombre del método, la segunda parte es el significado de la entrada o salida que representa la salida del productor o la entrada del consumidor, la tercera parte de 0 está fijada en rabbitmq, se proporciona por compatibilidad con kafkaf, escribimos 0 Eso es bien. El nombre del conmutador se configura en el destino, y las variables detrás son el significado del entorno, que se convertirá en dev, test, uat, etc. en ese momento. El grupo de grupo debe configurarse. Lo llamaré el nombre del módulo aquí.

Punto clave: Se debe configurar el siguiente productor: required-groups, que es el nombre del grupo.

A continuación, configure el consumidor. Si el conmutador vinculado es el conmutador de mensajes fallidos configurado para el productor en la parte inferior, recuerde completar el nombre del grupo o no se consumirá.

El siguiente tipo de contenido es el tipo, no puede especificarlo, el valor predeterminado es este

La parte inferior es la configuración de conejo En bingdings, configuré un interruptor de letra muerta para el productor Bondi, y luego establecí el ttl de la letra muerta durante cuánto tiempo el productor no ha consumido. dead-letter-exchange es el nombre del conmutador especificado, puede establecerlo en el nombre del conmutador original _DLX por el bien de la especificación, y luego configurar el nombre de la cola de mensajes fallidos, es decir, agregar el grupo detrás del conmutador, que debe ser coherente con el grupo anterior.

Debido a que los mensajes de la cola de mensajes fallidos aquí son directos, los consumidores están escuchando los mensajes que han expirado en la cola de mensajes fallidos, por lo que el tipo de cambio también debe establecerse en directo, de lo contrario, informará: excepción de tema de conversión de mensajes directos, pero esto la excepción solo ocurrirá en el primer informe de noticias A, las siguientes noticias no se escucharán, puede ser que la capa inferior de Springcloud Stream nos haya ayudado a lidiar con eso, pero para evitar el primer informe de error, es mejor establecer el tipo de interruptor.

  cloud:
    function:
      definition: memberAccountUpdateTaskDelayed;handleTaskDelayed;
    stream:
      bindings:
        memberAccountUpdateTaskDelayed-out-0:
          destination: MEMBER_TOPIC_${spring.profiles.active} #延迟exchange,交换模式是topic
          content-type: application/json #设置消息的类型为json
          group: ${spring.application.name}
          producer:
            required-groups: ${spring.application.name} #必须要制定生产者分组,不然发不过去
        handleTaskDelayed-in-0:
          destination: MEMBER_TOPIC_DLX_${spring.profiles.active}
          content-type: application/json
          group: ${spring.application.name}
      rabbit:
        bindings:
          memberAccountUpdateTaskDelayed-out-0:
            producer:
              ttl: 10000 #延时队列的延时时间,单位毫秒
              auto-bind-dlq: true #开启死信队列
              dead-letter-exchange: MEMBER_TOPIC_DLX_${spring.profiles.active} #死信交换机
              dead-letter-queueName: MEMBER_TOPIC_DLX_${spring.profiles.active}.${spring.application.name} #死信队列名称
          handleTaskDelayed-in-0:
            consumer:
              exchange-type: direct #死信交换机必须是direct类型的才能接受

Productor envía mensaje 

Aquí estoy enviando un objeto, que se envía en TaskDelayMessage. Recuerde agregar anotaciones de deserialización JSON a los atributos en la clase de entidad, de lo contrario, los consumidores informarán un error de deserialización al escuchar.

El nombre del método debe ser el mismo que el nombre del método que configuró en el archivo de configuración

@Repository
@Slf4j
public class MemberAccountUpdateTaskHandleTimeoutTaskRepositoryImpl implements MemberAccountUpdateTaskHandleTimeoutTaskRepository {

    private final Sinks.Many<Message<TaskDelayMessage>> sinks =
            Sinks.many().multicast().onBackpressureBuffer();

    @Bean
    public Supplier<Flux<Message<TaskDelayMessage>>> memberAccountUpdateTaskDelayed(){
        return sinks::asFlux;
    }

    @Override
    public void sendDelayMessage(TaskDelayMessage message) {
        log.info("生产者准备发送消息:{}", message+" -"+System.currentTimeMillis());
        Message<TaskDelayMessage> msg = MessageBuilder.withPayload(message).build();
        while (sinks.tryEmitNext(msg).isFailure()) {
            LockSupport.parkNanos(10);
        }
        log.info("生产者成功发送消息:{}", message+" -"+System.currentTimeMillis());
    }
}

El consumidor escucha los mensajes.

El nombre del método debe ser el mismo que el nombre del método que configuró en el archivo de configuración

    @Bean
	Consumer<TaskDelayMessage> handleTaskDelayed() {
		return message-> {
			log.info("消费者监听到了消息:{}", message);
			memberAccountUpdateTaskService.handleTimeOutTasks(message);
		};
	}

Resumir 

Resumen: De hecho, es problemático de configurar. Realmente hay pocos tutoriales y blogs sobre springcloud steam en China. Durante el proceso de construcción, se encontraron muchos problemas en csdn y estación b, y no se encontró ninguna solución. Finalmente, leí los documentos oficiales de YouTube y springcloud y seguí para ver el código fuente para resolverlo. Si desea aprender el componente de transmisión, se recomienda ir a YouTube para leer el tutorial o directamente a la documentación del sitio web oficial de springcloud.

Supongo que te gusta

Origin blog.csdn.net/weixin_54232666/article/details/130793915
Recomendado
Clasificación