Springboot 2.x integra Rabbitmq para alcanzar el límite de corriente del consumidor, confirmación de confirmación manual

Prefacio

En nuestro proyecto actual, es posible que hayamos acumulado miles de mensajes en mq. Si no limitamos el flujo, cuando encendemos al consumidor, miles de mensajes se conectarán repentinamente, lo que puede causar que el servidor Tiempo de inactividad o graves lagunas en el negocio, por lo que debemos limitar la corriente del consumidor.

En primer lugar, mi versión springboot, springBootVersion = '2.2.1.RELEASE'. Las configuraciones de otras versiones no son muy diferentes.

Primero mire la configuración, aquí solo se usa la configuración sin comentarios:

server:
  port: 3002

spring:
  application:
    name: zoo-plus-mq
    #https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/reference/html/common-application-properties.html
  rabbitmq:
    virtual-host: /
    host: 127.0.0.1
    username: guest
    password: guest
    port: 5672
#    #必须配置这个才会确认回调
#    publisher-confirm-type: correlated
#    #支持发布返回
#    publisher-returns: true
    listener:
      type: simple
      simple:
        #采用手动应答
        acknowledge-mode: manual
        prefetch: 1 #限制每次发送一条数据。
#        #当前监听容器数 同一个队列启动几个消费者
#        concurrency: 1
#        #启动消费者最大数量
#        max-concurrency: 1
#        #是否支持重试
#        retry:
#          enabled: true
#          max-attempts: 5
#          stateless: false
#          #时间策略乘数因子
#          multiplier: 1.0
#          initial-interval: 1000ms
#          max-interval: 10000ms
#        default-requeue-rejected: true

Cree una nueva cola de prueba:

    /**
     * 测试队列
     */
    @Bean
    public Queue testQueue() {
        return QueueBuilder.nonDurable("test-queue").build();
    }

Productor:


    /**
     * 发送五条数据,测试消费端必须ack才发送第二条,消费者限流
     */
    @GetMapping("ack")
    public Resp testAck() {
        for (int i = 0; i < 5; i++) {
            rabbitTemplate.convertAndSend("test-queue", "测试ack确认模式");
        }
        return Resp.success("ok", null);
    }

consumidor:

    @RabbitListener(queues = {"test-queue"})
    public void testQueue(Message message, Channel channel) throws IOException {
        log.info("test-queue消费:" + new String(message.getBody()));

        /*
              listener:
                type: simple
                simple:
                  #采用手动应答
                  acknowledge-mode: manual
                  prefetch: 1 #限制每次发送一条数据。
         */
//        采用手动ack,一条条的消费
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
    }

De la prueba anterior, si no configuramos, los cinco mensajes se aglomerarán a la vez. Si agregamos la configuración y no ack del lado del consumidor, el mensaje se deshabilitará y el mensaje se enviará nuevamente la próxima vez que se reinicie el servicio. Hasta que el consumidor finalice.

Supongo que te gusta

Origin blog.csdn.net/qq_36850813/article/details/103288667
Recomendado
Clasificación