Подробное объяснение механизма подтверждения выпуска сообщений RabbitMQ.
Подробное объяснение механизма подтверждения выпуска сообщений RabbitMQ.

Механизм подтверждения выпуска RabbitMQ гарантирует успешную передачу сообщений от производителей коммутаторам и очередям, повышая надежность системы. Весной Загрузочный проект,проходить Конфигурацияpublisher-confirm-typeиpublisher-returns,启用发布确认и消息返回机制。КонфигурацияRabbitTemplate的确认回调и返回回调,Может фиксировать статус передачи сообщений,Обработка различных результатов передачи. Сценарии тестирования включают сообщения, не доходящие до выключателя, сообщения, доходящие до выключателя, но не включающие, и сообщения, доходящие до выключателя успешно. За счет разумных настроек и оптимизации,Может обеспечить надежную передачу сообщений в средах с высоким уровнем параллелизма.,Подходит для финансовых платежей, Система электронной коммерции и другие сценарии, требующие высокой надежности передачи сообщений.

1. Обзор механизма подтверждения выпуска RabbitMQ

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

  • Подтверждение после попадания сообщения на биржу (Exchange)
  • Подтверждение после маршрутизации сообщения от коммутатора в очередь (Queue)

2. Добавьте конфигурацию, связанную с подтверждением выпуска, в файл конфигурации.

Весной В проекте Boot включите Механизм через файл конфигурации. подтверждения выпускаочень удобно。Далее следует добавить то, чтоapplication.propertiesилиapplication.ymlв Конфигурация:

Язык кода:javascript
копировать
# После того, как сообщение поступит на выключатель, отправителю перезвонят
spring.rabbitmq.publisher-confirm-type=correlated
# Обратный вызов отправителю, когда сообщение не может быть перенаправлено в очередь
spring.rabbitmq.publisher-returns=true

Объяснение конфигурации:

  • publisher-confirm-type:установлен наcorrelatedвыражатьиспользоватьCorrelationDataПриходить Связывание подтверждений с отправленными сообщениями。
  • publisher-returns:установлен наtrueвыражать启用消息返回机制,Обратный вызов запускается, когда сообщение не может быть перенаправлено в очередь.

3. Тип подтверждения выпуска

Весной В AMQP, Тип подтверждения выпускапроходитьConfirmType枚举类Приходить定义:

Язык кода:javascript
копировать
public enum ConfirmType {
    SIMPLE,     // использовать RabbitTemplate#waitForConfirms() или waitForConfirmsOrDie()
    CORRELATED, // использовать CorrelationData Связывание подтверждений с отправленными сообщениями
    NONE        // Отключить подтверждение публикации
}

4. Настройте шаблон кролика

дляиспользовать Механизм подтверждения выпуска,нуждаться КонфигурацияRabbitTemplate,включать Установить обратный звонок для подтвержденияи返回回调:

Язык кода:javascript
копировать
@Slf4j
@Configuration
public class RabbitTemplateConfig {

    @Bean
    public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate();
        rabbitTemplate.setConnectionFactory(connectionFactory);

        // Установите для обязательного значение true. Если очередь не найдена, брокер вызовет метод Basic.return, чтобы вернуть сообщение производителю.
        rabbitTemplate.setMandatory(true);

        // Установить обратный звонок для подтверждения
        rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
            if (ack) {
                log.info("Сообщение поступило на Exchange");
            } else {
                log.info("Сообщение не дошло на Exchange");
            }
            if (correlationData != null) {
                log.info("Связанные данные:" + correlationData);
            }
            if (cause != null) {
                log.info("Причина:" + cause);
            }
        });

        // Установить обратный вызов
        rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
            log.info("Срабатывает, когда сообщение не может дойти");
            log.info("ReturnCallback:     " + "информация:" + message);
            log.info("ReturnCallback:     " + «Код ответа:» + replyCode);
            log.info("ReturnCallback:     " + «Ответное сообщение:» + replyText);
            log.info("ReturnCallback:     " + "выключатель:" + exchange);
            log.info("ReturnCallback:     " + «Ключ маршрутизации:» + routingKey);
        });

        return rabbitTemplate;
    }
}

5. Настройте тестовые переключатели и очереди.

Чтобы протестировать механизм подтверждения релиза, нам необходимо настроить соответствующие переключатели и очереди:

Язык кода:javascript
копировать
@Slf4j
@Configuration
public class ConfirmConfig {

    @Bean
    public Queue confirmQueue() {
        return new Queue(Constant.CONFIRM_QUEUE, false);
    }

    @Bean
    DirectExchange confirmExchange() {
        DirectExchange directExchange = new DirectExchange(Constant.CONFIRM_EXCHANGE, false, false);
        directExchange.addArgument("alternate-exchange", Constant.CONFIRM_BACKUP_EXCHANGE);
        return directExchange;
    }

    @Bean
    Binding bindingConfirm() {
        return BindingBuilder.bind(confirmQueue()).to(confirmExchange()).with(Constant.CONFIRM_ROUTING_KEY);
    }

    @Bean
    FanoutExchange backupExchange() {
        return new FanoutExchange(Constant.CONFIRM_BACKUP_EXCHANGE, false, false);
    }

    @Bean
    public Queue backupQueue() {
        return new Queue(Constant.CONFIRM_BACKUP_QUEUE, false);
    }

    @Bean
    public Queue warningQueue() {
        return new Queue(Constant.CONFIRM_WARNING_QUEUE, false);
    }

    @Bean
    Binding bindingConfirmBackup() {
        return BindingBuilder.bind(backupQueue()).to(backupExchange());
    }

    @Bean
    Binding bindingConfirmWarning() {
        return BindingBuilder.bind(warningQueue()).to(backupExchange());
    }
}

6. Тестовые сценарии и анализ

6.1 Сообщение не может дойти до коммутатора

Тестовый код:

Язык кода:javascript
копировать
@Autowired
RabbitTemplate rabbitTemplate;
String msg = «Сообщение о подтверждении публикации»;

@GetMapping("/noExchange")
public void noExchange() {
    rabbitTemplate.convertAndSend("noExchange", "noExchange", msg);
}

Конфигурация ПонятноrabbitTemplate.setMandatory(true),Он будет вызван, когда сообщение не может дойти до выключателя:

Язык кода:javascript
копировать
ConfirmCallback Сообщение не приходит в Exchange
ConfirmCallback Причина: канал error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'noExchange' in vhost '/', class-id=60, method-id=40)
6.2 Сообщение достигает коммутатора, но не может попасть в очередь

Тестовый код:

Язык кода:javascript
копировать
@GetMapping("/toExchange")
public void toExchange() {
    rabbitTemplate.convertAndSend(Constant.CONFIRM_EXCHANGE, "xxx.xxx.xxx", msg);
}

Выход:

Язык кода:javascript
копировать
ConfirmCallback Сообщение прибыло в Exchange

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

6.3 Выйдите из очереди резервного копирования и повторите попытку.

Изменить конфигурацию:

Язык кода:javascript
копировать
@Bean
DirectExchange confirmExchange() {
    DirectExchange directExchange = new DirectExchange(Constant.CONFIRM_EXCHANGE, true, false);
    return directExchange;
}

Результаты испытаний:

Язык кода:javascript
копировать
Срабатывает, когда сообщение не может быть достигнуто
ReturnCallback:     Сообщение: (Тело: «Сообщение для подтверждения публикации» MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, deliveryTag=0])
ReturnCallback:     Код ответа: 312
ReturnCallback:     Ответное сообщение: NO_ROUTE
ReturnCallback:     выключатель:myConfirmExchange
ReturnCallback:     Ключ маршрутизации: xxx.xxx.xxx
ConfirmCallback Сообщение прибыло в Exchange

в это время,ConfirmCallbackиReturnCallback都被调用Понятно。

6.4 Успешно прибыл в очередь

Тестовый код:

Язык кода:javascript
копировать
@GetMapping("/toQueue")
public void toQueue() {
    rabbitTemplate.convertAndSend(Constant.CONFIRM_EXCHANGE, Constant.CONFIRM_ROUTING_KEY, msg);
}

Выход:

Язык кода:javascript
копировать
ConfirmCallback Сообщение прибыло в Exchange

7. Процесс подтверждения выпуска

На следующем рисунке показан процесс подтверждения выпуска RabbitMQ:

8. Углубленный анализ механизма подтверждения выпуска RabbitMQ.

8.1 Сравнение механизма транзакции и механизма подтверждения выпуска

Механизм транзакций и механизм подтверждения выпуска являются средствами обеспечения надежной доставки сообщений, но они имеют очевидные различия в реализации и производительности:

  • механизм транзакции:проходитьtxSelecttxCommitиtxRollbackвыполнить,производительность Дороже,Нет Подходит для сценариев с высоким параллелизмом.
  • Механизм подтверждения выпуска:проходить异步确认消息是否成功到达выключательиочередь,производительность Бюджетный,Подходит для сценариев с высоким параллелизмом.
8.2 Преимущества и недостатки механизма подтверждения выпуска
преимущество
  1. Высокая производительность:по сравнению смеханизм транзакции,Механизм подтверждения выпуска оказывает меньшее влияние на производительность.
  2. Асинхронная обработка:использовать Функция обратного вызова обрабатывает результаты подтверждения,Не блокирует отправку сообщений.
  3. Высокая надежность:Убедитесь, что сообщение доставлено успешновыключательиочередь,Повысьте надежность системы.
недостаток
  1. Сложно реализовать:нуждаться Конфигурацияи处理回调函数,Повышенная сложность кода.
  2. Высокая задержка:确认机制引入Понятно额外的网络延迟。
8.3 Сценарии применения механизма подтверждения выпуска
  1. финансовая платежная система:Обеспечить надежную передачу платежных сообщений,Избегайте двойных платежейили Потерянный платежтерять.
  2. Система электронной коммерции:Обеспечить надежную передачу сообщений о заказах,Избегайте потери заказаили Повторить обработку。
  3. Система регистрации:Обеспечьте надежную доставку сообщений журнала.,Избегайте потери журналов

терять.

8.4 Лучшие практики для механизмов подтверждения выпуска
  1. Установите тайм-аут правильно:В сценариях с высоким параллелизмом,Установите разумный тайм-аут,Избегайте блокировки отправки сообщений.
  2. Оптимизировать функцию обратного вызова:Избегайте сложной логики в функциях обратного вызова,Обеспечьте быстрое завершение обработки обратного вызова.
  3. Мониторинг и тревога:Создать механизм мониторинга,Своевременно обнаруживайте и устраняйте ошибки доставки сообщений.

9. Резюме

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

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