Серия промежуточного программного обеспечения для сообщений жесткого объема (8): Подробное объяснение механизма повтора RabbitMQ.
Серия промежуточного программного обеспечения для сообщений жесткого объема (8): Подробное объяснение механизма повтора RabbitMQ.

Введение в механизм повтора RabbitMQ

RabbitMQ не устанавливает время истечения срока действия для неподтвержденных сообщений. Единственной основой для определения необходимости повторной доставки сообщения потребителю является то, было ли отключено соединение для использования сообщения. Причиной этого параметра является время, в течение которого RabbitMQ позволяет потребителям. потреблять сообщение. Это может занять очень много времени.

На платформе веб-управления RabbitMQ вы можете увидеть количество сообщений в состоянии «Готово» и «Неподтверждено» в текущей очереди, что соответственно соответствует количеству сообщений, ожидающих доставки потребителю, и сообщений, которые уже были доставлены потребителю, но не получили номер подтверждения. Как показано ниже:

На что следует обратить внимание
  • Если существование обрабатывает сообщение из,аномальное появляется, когда сервер-потребитель обрабатывает сообщение из,Тогда возможно, что это обрабатываемое сообщение не завершает потребление сообщения.,Данные будут потеряны. Чтобы данные не были потеряны,RabbitMQ Поддержка подтверждения сообщения-ACK.
  • Если вы забудете подтвердить сообщение, последствия будут серьезными. Когда Потребитель выходит, Сообщение всегда будет перераспределено. Тогда RabbitMQ будет занимать все больше и больше контента, а поскольку RabbitMQ будет работать долго, такая «утечка памяти» фатальна.
Автоматическое подтверждение RabbitMQ

Автоматическое подтверждение разделено на четыре ситуации (первая — нормальное потребление, остальные три — нештатные ситуации)

  • Сообщение было успешно использовано,нет броска аномальный,затем автоматически подтвердите,Ответить, акк. Не требует запроса,В конце концов, это удалось. requeue вступает в силу для отклоненных сообщений.
  • При выдаче ImmediateAcknowledgeAmqpExceptionаномальныйиз,считается успешным потреблением,Подтвердите сообщение.
  • При выдаче AmqpRejectAndDontRequeueExceptionаномальныйиз,Сообщение будет отклонено,И запросить = false (аномальное сообщение будет выдано после превышения лимита повторных попыток)
  • Подкиньте другой изаномальный,Сообщение будет отклонено,и запрос = true

Я столкнулся с четвертой ситуацией, из-за которой сообщение mq было заблокировано, и потребитель продолжал использовать одно и то же сообщение, а затем выдал исключение, а затем вошел в бесконечный цикл. Если сообщение не подтверждено, это показано на рисунке ниже:

В механизме повторной попытки возможны две ситуации.
  • Когда сообщение автоматически подтверждено,Если выбран аномальный запрос, несколько повторных попыток завершится неудачно.,Сообщение автоматически подтверждается,Сообщение было потеряно
  • Когда сообщение подтверждено вручную,Если выбран аномальный запрос, несколько повторных попыток завершится неудачно.,Новость не подтвердилась,Тоже не могу нюхать,Он всегда в неактивированном статусе,В результате образуется скопление сообщений.
  • Подробнее о промежуточном программном обеспечении для сообщений RabbitMQ Серия обучающих статей,Видеть:Промежуточное программное обеспечение сообщений RabbitMQ, эта серия постоянно обновляется.
Базовая конфигурация
Язык кода:javascript
копировать
spring:
  # Название проекта
  application:
    name: rabbitmq-consumer
  # RabbitMQСлужить Конфигурация  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    listener:
      simple:
        # Механизм повтора
        retry:
          enabled: true #Включить ли повторную попытку потребителя
          max-attempts: 5 #Максимальное количество повторов
          initial-interval: 5000ms #Интервал повтора (единица миллисекунды)
          max-interval: 1200000ms #Максимальный интервал повтора (в миллисекундах)
          multiplier: 2 #Множитель интервала времени, интервал времени * множитель = следующий из интервала времени, максимум не может превышать установленный из максимального интервала времени

Реализация механизма повтора RabbitMQ

Ниже будет объяснена реализация механизма повторных попыток RabbitMQ на примерах. Во-первых, вам необходимо создать два проекта SpringBoot и интегрировать клиент RabbitMQ.

Реализовать завершение отправки сообщения
Создайте первый проект SpringBoot (проект обмена сообщениями Rabbitmq-провайдера).

В файле информации конфигурации pom.xml добавьте соответствующие файлы зависимостей:

Язык кода:javascript
копировать
<!-- AMQP-клиент -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
    <version>2.4.1</version>
</dependency>

Настройте службу RabbitMQ в файле конфигурации application.yml:

Язык кода:javascript
копировать
spring:
  # Название проекта
  application:
    name: rabbitmq-provider
  # RabbitMQСлужить Конфигурация  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
Настроить очередь

существовать rabbitmq-provider(элементы отправки сообщений)середина,Настроить поочередно назовите и передайтепоочередно IoC Управление, код следующий:

Язык кода:javascript
копировать
package com.pjb.config;
 
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
/**
 * Класс RabbitMQConfiguration
 * @author pan_junbiao
 **/
@Configuration
public class RabbitMqConfig
{
    public static final String QUEUE_NAME = "queue_name"; //очередьимя    public static final String EXCHANGE_NAME = "exchange_name"; //Название обменника
    public static final String ROUTING_KEY = "routing_key"; //ключ маршрутизации
 
    /**
     * очередь
     */
    @Bean
    public Queue queue()
    {
        /**
         * Createturn, описание параметра:
         * String name:очередьимя。         * boolean прочный: установите, будет ли сохраняться, значение по умолчанию — false。durable установлен на true Это означает настойчивость, иначе это означает ненастойчивость.
         * Изочередность персистентности будет сохранена на диске, и соответствующая информация не будет потеряна при перезапуске сервера.
         * boolean эксклюзивный: установите, будет ли он эксклюзивным, по умолчанию также ЛОЖЬ. для true Затем установите режим эксклюзивного доступа.
         * boolean autoDelete: установите, следует ли удалять автоматически, т.е. true Затем установите автоматическое удаление,
         * Если ни один производитель или потребитель не использует эту очередь, она автоматически удаляется.
         * Map<String, Object> аргументы: установите некоторые другие параметры.
         */
        return new Queue(QUEUE_NAME, true, false, false, null);
    }
 
    /**
     * Прямой переключатель
     */
    @Bean
    public DirectExchange exchange()
    {
        /**
         * Создание обменника, описание параметров:
         * String имя: имя переключателя
         * boolean прочный: установите, будет ли сохраняться, значение по умолчанию — false。durable установлен на true Это означает настойчивость, иначе это означает ненастойчивость.
         * Постоянство позволяет сохранить переключатель на диск, чтобы соответствующая информация не потерялась при перезапуске сервера.
         * boolean autoDelete: установите, следует ли удалять автоматически, т.е. true Затем установите автоматическое удаление,
         */
        return new DirectExchange(EXCHANGE_NAME, true, false);
    }
 
    /**
     * обязательность
     */
    @Bean
    Binding binding(DirectExchange exchange, Queue queue)
    {
        //Воляочередьи переключитьсяобязательность, И установите ключ, используемый для сопоставления: routerKey
        return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
    }
}

Подробнее о промежуточном программном обеспечении для сообщений RabbitMQ Серия обучающих статей,Видеть:Промежуточное программное обеспечение сообщений RabbitMQ, эта серия постоянно обновляется.

Создать отправителя

существовать rabbitmq-provider(элементы отправки сообщений)середина,Создать отправителя,использовать rabbitTemplate.convertAndSend() метод отправки сообщения, код выглядит следующим образом:

Язык кода:javascript
копировать
package com.pjb;
 
import com.pjb.config.RabbitMqConfig;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
 
/**
 * Тестовый класс RabbitMq
 * @author pan_junbiao
 **/
@SpringBootTest
public class RabbitMqTest
{
    @Autowired
    RabbitTemplate rabbitTemplate;
 
    @Test
    public void sendMessage()
    {
        String message = «Здравствуйте, добро пожаловать в гости pan_junbiaoизблог";
        rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_NAME, RabbitMqConfig.ROUTING_KEY, message);
        System.out.println("Сообщение отправлено успешно!");
    }
}
Реализация завершения приема сообщений
Создайте второй проект SpringBoot (проект получения сообщений Rabbitmq-потребителя)

В файле информации конфигурации pom.xml добавьте соответствующие файлы зависимостей:

Язык кода:javascript
копировать
<!-- AMQP-клиент -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
    <version>2.4.1</version>
</dependency>

существовать application.yml Настроить в файле конфигурации RabbitMQ Сервис, его нужно настроить здесь RabbitMQ Механизм повтора:

Язык кода:javascript
копировать
spring:
  # Название проекта
  application:
    name: rabbitmq-consumer
  # RabbitMQСлужить Конфигурация  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    listener:
      simple:
        # Механизм повтора
        retry:
          enabled: true #Включить ли повторную попытку потребителя
          max-attempts: 5 #Максимальное количество повторов
          initial-interval: 5000ms #Интервал повтора (единица миллисекунды)
          max-interval: 1200000ms #Максимальный интервал повтора (в миллисекундах)
          multiplier: 2 #Множитель интервала времени, интервал времени * множитель = следующий из интервала времени, максимум не может превышать установленный из максимального интервала времени
Создать получателя

существовать rabbitmq-consumer(Проект получения сообщений)середина,создавать Создать получателя, внимания, отправителя и получателя из Queue Имена должны совпадать, иначе сообщение невозможно будет получить.

После того как получатель получает сообщение, он распечатывает его, а затем программа выдает исключение во время выполнения и наблюдает за явлением. Код выглядит следующим образом:

Язык кода:javascript
копировать
package com.pjb.receiver;
 
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
 
import java.text.SimpleDateFormat;
import java.util.Date;
 
/**
 * получатель
 * @author pan_junbiao
 **/
@Component
@RabbitListener(queues="queue_name")
public class Receiver
{
    @RabbitHandler
    public void process(String message)
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Получить сообщение: " + message + " Время получения: " + sdf.format(new Date()));
        throw new RuntimeException();
    }
}

Особое внимание:

  • Если существует приемник сообщений из application.yml Конфигурация не добавлена ​​в файл RabbitMQ Механизм повтораиз Связанный Конфигурация,Когда принимающая сторона получает сообщение, программа выдает аномальное сообщение.,Тогда отправитель не получит подтверждение сообщения (ACK).,В это время отправитель будет отправлять сообщения в цикле.,В конечном итоге это приводит к переполнению памяти.
Результат выполнения

Из приведенного выше результата Судя по выполнению, когда принимающая сторона повторит попытку 5 раз, сообщение будет подтверждено (ACK). Подробнее о промежуточном программном обеспечении для сообщений RabbitMQ Серия обучающих статей,Видеть:Промежуточное программное обеспечение сообщений RabbitMQ, эта серия постоянно обновляется.

Справочная статья: https://blog.csdn.net/pan_junbiao/article/details. /113038421 https://blog.csdn.net/feiying0canglang/article/ details/127368401

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose