Механизм подтверждения выпуска RabbitMQ гарантирует успешную передачу сообщений от производителей коммутаторам и очередям, повышая надежность системы. Весной Загрузочный проект,проходить Конфигурацияpublisher-confirm-type
иpublisher-returns
,启用发布确认и消息返回机制。КонфигурацияRabbitTemplate
的确认回调и返回回调,Может фиксировать статус передачи сообщений,Обработка различных результатов передачи. Сценарии тестирования включают сообщения, не доходящие до выключателя, сообщения, доходящие до выключателя, но не включающие, и сообщения, доходящие до выключателя успешно. За счет разумных настроек и оптимизации,Может обеспечить надежную передачу сообщений в средах с высоким уровнем параллелизма.,Подходит для финансовых платежей, Система электронной коммерции и другие сценарии, требующие высокой надежности передачи сообщений.
Подтверждения издателя (Publisher Confirms) — это механизм, предоставляемый RabbitMQ для обеспечения того, чтобы сообщения отправлялись от производителя на сервер RabbitMQ и успешно обрабатывались. В отличие от механизма транзакций, подтверждение выпуска требует меньших затрат на производительность и очень подходит для сценариев с высокой пропускной способностью. Механизм подтверждения выпуска предусматривает два типа подтверждений:
Весной В проекте Boot включите Механизм через файл конфигурации. подтверждения выпускаочень удобно。Далее следует добавить то, чтоapplication.properties
илиapplication.yml
в Конфигурация:
# После того, как сообщение поступит на выключатель, отправителю перезвонят
spring.rabbitmq.publisher-confirm-type=correlated
# Обратный вызов отправителю, когда сообщение не может быть перенаправлено в очередь
spring.rabbitmq.publisher-returns=true
Объяснение конфигурации:
publisher-confirm-type
:установлен наcorrelated
выражатьиспользоватьCorrelationData
Приходить Связывание подтверждений с отправленными сообщениями。publisher-returns
:установлен наtrue
выражать启用消息返回机制,Обратный вызов запускается, когда сообщение не может быть перенаправлено в очередь.Весной В AMQP, Тип подтверждения выпускапроходитьConfirmType
枚举类Приходить定义:
public enum ConfirmType {
SIMPLE, // использовать RabbitTemplate#waitForConfirms() или waitForConfirmsOrDie()
CORRELATED, // использовать CorrelationData Связывание подтверждений с отправленными сообщениями
NONE // Отключить подтверждение публикации
}
дляиспользовать Механизм подтверждения выпуска,нуждаться КонфигурацияRabbitTemplate
,включать Установить обратный звонок для подтвержденияи返回回调:
@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;
}
}
Чтобы протестировать механизм подтверждения релиза, нам необходимо настроить соответствующие переключатели и очереди:
@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());
}
}
Тестовый код:
@Autowired
RabbitTemplate rabbitTemplate;
String msg = «Сообщение о подтверждении публикации»;
@GetMapping("/noExchange")
public void noExchange() {
rabbitTemplate.convertAndSend("noExchange", "noExchange", msg);
}
Конфигурация ПонятноrabbitTemplate.setMandatory(true)
,Он будет вызван, когда сообщение не может дойти до выключателя:
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)
Тестовый код:
@GetMapping("/toExchange")
public void toExchange() {
rabbitTemplate.convertAndSend(Constant.CONFIRM_EXCHANGE, "xxx.xxx.xxx", msg);
}
Выход:
ConfirmCallback Сообщение прибыло в Exchange
Никакие сообщения, которые не могут попасть в очередь, не принимаются, поскольку очередь резервного копирования настроена и сообщения направляются в очередь резервного копирования.
Изменить конфигурацию:
@Bean
DirectExchange confirmExchange() {
DirectExchange directExchange = new DirectExchange(Constant.CONFIRM_EXCHANGE, true, false);
return directExchange;
}
Результаты испытаний:
Срабатывает, когда сообщение не может быть достигнуто
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
都被调用Понятно。
Тестовый код:
@GetMapping("/toQueue")
public void toQueue() {
rabbitTemplate.convertAndSend(Constant.CONFIRM_EXCHANGE, Constant.CONFIRM_ROUTING_KEY, msg);
}
Выход:
ConfirmCallback Сообщение прибыло в Exchange
На следующем рисунке показан процесс подтверждения выпуска RabbitMQ:
Механизм транзакций и механизм подтверждения выпуска являются средствами обеспечения надежной доставки сообщений, но они имеют очевидные различия в реализации и производительности:
txSelect
、txCommit
иtxRollback
выполнить,производительность Дороже,Нет Подходит для сценариев с высоким параллелизмом.терять.
В этой статье подробно описывается механизм подтверждения выпуска сообщений RabbitMQ, включая настройку, реализацию и его производительность в различных сценариях. Путем правильной настройки и использования механизма подтверждения выпуска можно эффективно повысить надежность передачи сообщений и обеспечить надежную доставку сообщений в среде с высоким уровнем параллелизма. Я надеюсь, что эта статья поможет читателям глубже понять и применить механизм подтверждения выпуска RabbitMQ, а также повысить надежность и производительность системы.