Руководство RabbitMQ - Часть 7. Publisher Confirms - надёжная публикация

06.08.26

Интеграция - Внешние источники данных

Перевод руководства и адаптация кода под платформу 1С. Источник https://www.rabbitmq.com/tutorials/tutorial-seven-ruby

Подготовка окружения

Компонента kovalevdmv/1CRabbitMQ, обработка КлиентRMQ. Брокер - как в части 1.

Код примеров собран в расширении RMQ_lessons (malikov-pro/1CRabbitMQ) для запуска через YAxUnit.

Те же сценарии можно вызывать из консоли кода в серверном контексте - например bsl_console и аналоги.

 

На чём сосредоточена часть

В части 2 мы помечали сообщения как persistent и объявляли durable-очередь - это про хранение после того, как брокер сообщение принял. Publisher confirms отвечают на другой вопрос: брокер подтвердил приём публикации?

Это расширение AMQP 0-9.1: на канале с confirms клиент публикует, сервер асинхронно шлёт ack/nack. Клиентские библиотеки по-разному оборачивают ожидание.

В КлиентRMQ доступна синхронная публикация с confirms. Ниже - этот режим в коде и кратко два других подхода (пакет / async), которые в компоненте «из коробки» не оформлены.

 

Подходы к confirms

Публикация по одному (доступна в 1С)

В КлиентRMQ confirms включают вторым параметром СоздатьКанал. После ОпубликоватьСообщение в Ответ.Текст уже есть статус (is_ack / is_nack / not_requested). Без флага на канале статус confirms не приходит.

Подключение = КлиентRMQ.ПодключитьсяКСерверу(URI);
ПодтверждениеПубликацийОтСервера = Истина;
Канал = КлиентRMQ.СоздатьКанал(Подключение, ПодтверждениеПубликацийОтСервера);

ИмяОчереди = ОМ_РМКУ_Настройки.ИмяОчередиЧасть7(); // "confirm_demo"
Очередь = ОМ_РМКУ_Настройки.ОбъявитьОчередь(КлиентRMQ, Канал, ИмяОчереди); // durable + quorum

Ответ = КлиентRMQ.ОпубликоватьСообщение(
	Канал, ТекстСообщения, ИмяОчереди, "", Истина, Истина); // persistent

Если КлиентRMQ.ЭтоОшибка(Ответ) Тогда
	ВызватьИсключение Ответ.Текст;
КонецЕсли;

Если Ответ.Текст = КлиентRMQ.ПодтверждениеСервера_СерверПодтвердилПолучениеСообщения() Тогда
	// брокер принял
ИначеЕсли Ответ.Текст = КлиентRMQ.ПодтверждениеСервера_Сервер_НЕ_ПодтвердилПолучениеСообщения() Тогда
	ВызватьИсключение "Публикация отклонена (nack)";
Иначе
	// not_requested - забыли включить confirms на канале
КонецЕсли;

Очередь confirm_demo - именованная durable + quorum, как в частях 1–2: тип очереди на смысл confirms не влияет.

Плюс: просто - опубликовали и сразу проверили статус. Минус: каждое сообщение ждёт свой круг подтверждения; для умеренной нагрузки обычно хватает, при высокой - узкое место.

Пакетная публикация (batch)

Клиент публикует несколько сообщений подряд без ожидания ack после каждого, затем один раз ждёт подтверждения на всю пачку (или до определённого sequence number).

Преимущество: заметно выше throughput - круг ожидания делится на N сообщений, а не повторяется N раз. Цена: при nack или обрыве труднее понять, какое сообщение из пачки не принято; обычно переигрывают всю пачку или опираются на идемпотентность получателя.

Асинхронные confirms

Клиент не блокируется на публикации: брокер шлёт ack/nack в фоне, библиотека вызывает callback и ведёт учёт по sequence number (какие delivery ещё «в полёте»).

Преимущество: максимальная скорость при сохранении надёжности - канал загружен публикациями, подтверждения обрабатываются по мере поступления. Цена: больше кода (карта неподтверждённых, таймауты, повтор при nack), сложнее рассуждать о порядке и корректности при ошибках.

 

Отказоустойчивость и производительность

Confirms, durable/persistent и consumer ack отвечают на разные сбои - их не стоит смешивать в одну «гарантию».

Приём на брокере. Publisher confirms говорят: сервер принял публикацию на канал. Без них клиент не знает, дошло ли сообщение после обрыва сети или таймаута. Это слой «отправили не в пустоту».

Переживание рестарта. Durable-очередь и persistent-сообщение повышают шанс, что принятое сообщение останется на диске после рестарта брокера. Confirms этого не заменяют: is_ack не значит «уже записано навечно», а durable без confirms не отвечает, успела ли публикация дойти.

Обработка у получателя. Ручной ack (часть 2) - про то, что исполнитель завершил работу. Сообщение могло лежать в Ready/Unacked, пока consumer не подтвердил; падение исполнителя без ack возвращает задачу в очередь.

Производительность. Синхронный confirm на каждое сообщение - самый простой и самый дорогой по latency: круг «publish U94; wait ack» на каждое тело. Пакет и async (выше) поднимают throughput ценой сложности при nack. Persistent + quorum тоже дороже transient/classic: больше записи на диск и репликация. Имеет смысл включать слои там, где цена потери выше цены задержки: confirms на критичной публикации, durable/persistent на данных, которые нельзя потерять при рестарте, ручной ack на работе, которую нельзя «съесть» дважды без идемпотентности.

На практике слои комбинируют: confirms при отправке + persistent в durable (quorum) очередь + ack у исполнителя. «Ровно один раз навсегда» ни один слой сам не даёт - см. документацию confirms.

 

Собираем вместе

КлиентRMQ = Обработки.КлиентRMQ.Создать();
Подключение = КлиентRMQ.ПодключитьсяКСерверу(URI);
Канал = КлиентRMQ.СоздатьКанал(Подключение, Истина); // confirms ON

ИмяОчереди = ОМ_РМКУ_Настройки.ИмяОчередиЧасть7(); // "confirm_demo"
ОМ_РМКУ_Настройки.ОбъявитьОчередь(КлиентRMQ, Канал, ИмяОчереди);

Для Номер = 1 По 10 Цикл
	Ответ = КлиентRMQ.ОпубликоватьСообщение(
		Канал, "msg-" + Номер, ИмяОчереди, "", Истина, Истина);
	Если Ответ.Текст <> КлиентRMQ.ПодтверждениеСервера_СерверПодтвердилПолучениеСообщения() Тогда
		ВызватьИсключение СтрШаблон("Нет confirm для %1: %2", Номер, Ответ.Текст);
	КонецЕсли;
КонецЦикла;

КлиентRMQ.ЗакрытьКанал(Канал);
КлиентRMQ.ОтключитьсяОтСервера(Подключение);

Полный код и замеры - в расширении (по желанию).

 

Запуск решения

Если брокер помнит confirm_demo с другими параметрами - удалите через ОМ_РМКУ_ManagementAPI.УдалитьОчередь (или UI) и объявите снова (см. часть 1).

  1. Канал с ПодтверждениеПубликацийОтСервера = Истина.
  2. Опубликовать в confirm_demo (ОбъявитьОчередь - durable + quorum).
  3. Убедиться, что Ответ.Текст = is_ack.
  4. Для контраста: канал без confirms U94; not_requested.

YAxUnit (набор «Урок 7»): ОМ_ТестRMQ_Lessons.Урок7_PublisherConfirms.

В ЖР / окне сообщений примерно:

… | Отправка в очередь | … | данные: confirm:…
… | Подтверждение сервера | … | данные: is_ack

 

Результат

Включили publisher confirms на канале КлиентRMQ, проверили синхронный ack/nack, отделили confirms от durable/persistent и от consumer ack.

Отдельно - часть 8 и часть 9: очереди типа stream.

 

Ссылки на остальные части

Благодарю за внимание.

Создано совместно с Cursor Grok 4.5

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь 1С:Предприятие 8 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

35000 руб.

15.11.2022    32442    50    49    

49

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

85400 руб.

05.10.2022    14066    16    8    

17

Розничная торговля Внешние источники данных Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Фармацевтика, аптеки Россия Бухгалтерский учет Платные (руб)

Внешняя обработка загрузки данных из файла-выгрузки, сформированного в программе F3 TAIL версии 3.4 (и выше) или еФарма версии 2.1, в базу конфигурации 1С: Бухгалтерия предприятия 8, ред. 3.0 (Базовая, ПРОФ, КОРП, ФРЕШ (тонкий клиент)).

17080 руб.

19.12.2016    54771    126    107    

86

Производство готовой продукции (работ, услуг) Внешние источники данных 1С:Предприятие 8 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник 1С "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

10370 руб.

24.06.2021    26214    64    55    

47

Внешние источники данных Программист Бизнес-аналитик 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Обработка для выгрузки данных из подготовленных СКД в фоновом режиме в базу ClickHouseDB, PostgreSQL, MySQL, в шину данных с поддержкой REST API (CSV, JSON. SQL), в локальные файлы (CSV, JSON, XLS, XLSX) или в Google Sheets. Это дополнительная подключаемая обработка.

18000 руб.

21.08.2024    9813    25    4    

22

Оптовая торговля Розничная торговля Внешние источники данных Прайсы 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Хотите, чтобы остатки и цены товаров в вашей базе всегда были актуальными без лишних усилий? Теперь это возможно - автоматизируйте процесс загрузки и обновления данных о номенклатуре от ваших поставщиков или конкурентов. Как это работает? Вы сами настраиваете правила и расписание для каждого поставщика, чтобы обновление информации из произвольных форматов прайс-листов происходило автоматически.

15250 руб.

15.05.2024    4822    8    1    

9
Для отправки сообщения требуется регистрация/авторизация