Руководство RabbitMQ - Часть 4. Routing - маршрутизация по ключу (direct)

06.08.26

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

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

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

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

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

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

 

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

В части 3 fanout слал все логи всем подписчикам. Здесь добавим выбор: подписка только на подмножество. Например, критические ошибки - в «файл» (отдельный исполнитель), на «консоль» - все уровни.

 

 

Binding key и direct exchange

Привязка (binding) - связь очереди с типом exchange. У неё может быть binding key - в КлиентRMQ это параметр КлючМаршрутизации у ОбъявитьОчередь.

У fanout binding key игнорируется. У direct алгоритм простой: сообщение попадает в те очереди, у которых binding key точно совпадает с routing key публикации.

Как на схеме выше: у QS21; (файл) binding key error, у QS22; (консоль) - info, warning и error. Сообщение с routing key error → в обе очереди; info / warning → только QS22;; любой другой ключ - отброшен.

Несколько очередей могут иметь один и тот же binding key - тогда direct ведёт себя как fanout для этого ключа.

 

Система логов: уровень важности как ключ

Вместо logs (fanout) берём очередь direct_logs типа direct. Именованный exchange объявляем через ОМ_РМКУ_ManagementAPI.ОбъявитьExchange (Management HTTP API) или через Management UI.

ТочкаОбмена = ОМ_РМКУ_Настройки.ИмяОбменникаЧасть4(); // "direct_logs"
ОМ_РМКУ_ManagementAPI.ОбъявитьExchange(ТочкаОбмена, "direct");

При публикации routing key = уровень важности: info, warning, error.

ТочкаОбмена = "direct_logs";
Уровень = "error";
ТекстСообщения = "Run. Run. Or it will explode.";

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

Подписчик объявляет temporary-очередь и для каждого интересующего уровня - отдельную привязку (повторный ОбъявитьОчередь с тем же именем очереди и другим ключом):

ТочкаОбмена = "direct_logs";
Очередь = КлиентRMQ.ОбъявитьОчередь(
	Канал, "", "error", ТочкаОбмена, Ложь, Истина, Истина);
ИмяОчереди = Очередь.ИмяОчереди;

// ещё уровни на ту же очередь
КлиентRMQ.ОбъявитьОчередь(Канал, ИмяОчереди, "warning", ТочкаОбмена, Ложь, Истина, Истина);
// info - по желанию

Только error: одна привязка с ключом error. Все уровни - три привязки (info, warning, error).

 

 

Реализация

Издатель:

ТочкаОбмена = "direct_logs";
ОМ_РМКУ_ManagementAPI.ОбъявитьExchange(ТочкаОбмена, "direct");
КлиентRMQ.ОпубликоватьСообщение(Канал, ТекстСообщения, Уровень, ТочкаОбмена, Истина);

Подписчик (выбранные уровни):

Как в части 3: у подписчика лога АвтоматическоеПодтверждение = Истина - своя temporary-очередь и копия сообщения, не общая задача work queue (часть 2).

ТочкаОбмена = "direct_logs";
ОМ_РМКУ_ManagementAPI.ОбъявитьExchange(ТочкаОбмена, "direct");
Уровни = СтрРазделить("warning,error", ",");

Очередь = Неопределено;
Для Каждого Уровень Из Уровни Цикл
	Если Очередь = Неопределено Тогда
		Очередь = КлиентRMQ.ОбъявитьОчередь(
			Канал, "", Уровень, ТочкаОбмена, Ложь, Истина, Истина);
	Иначе
		КлиентRMQ.ОбъявитьОчередь(
			Канал, Очередь.ИмяОчереди, Уровень, ТочкаОбмена, Ложь, Истина, Истина);
	КонецЕсли;
КонецЦикла;

Получатель = КлиентRMQ.СоздатьПолучателя(
	Канал, Очередь.ИмяОчереди, "подписчик_direct", Истина,,,, ТаймаутОжиданияСек);

Пока КлиентRMQ.СледующееСообщение(Получатель) Цикл
	ДанныеСообщения = КлиентRMQ.ДанныеСообщения();
	// тело + уровень (ключ маршрутизации при публикации)
КонецЦикла;

 

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

Как в части 3: при ручном демо сначала слушатели с нужными binding key, потом emit.

YAxUnit - тесты набора «Урок 4» Урок4_RoutingВОднойИБ

Консоль кода (серверный контекст) - те же сценарии:

// smoke: direct_logs U94; подписчик только error + подписчик все уровни U94; emit error/info
ОМ_ТестRMQ_Lessons.Урок4_RoutingВОднойИБ();

// или вручную: два слушателя (ФЗ / сеансы по скелету «Подписчик» выше, разные наборы уровней)
// U94; потом emit по скелету «Издатель» (routing key = уровень)

Результат работы: в регистре rmq_ОчередьОбменаRMQ - исходящие Отправлено и входящие у подписчиков. Журнал сценария - с логическим именем часть4_routing. В ЖР / окне сообщений после Урок4_RoutingВОднойИБ примерно:

… | Старт | очередь: часть4_routing | данные: Урок4_RoutingВОднойИБ
… | Отправка в очередь | очередь: часть4_routing | данные: error | error:a1b2c3d4
… | Отправка в очередь | очередь: часть4_routing | данные: info | info:a1b2c3d4
… | Получение из очереди | очередь: часть4_routing | данные: подписчик error | error:a1b2c3d4
… | Получение из очереди | очередь: часть4_routing | данные: подписчик все | error:a1b2c3d4
… | Получение из очереди | очередь: часть4_routing | данные: подписчик все | info:a1b2c3d4
… | Окончание | очередь: часть4_routing | данные: Урок4_RoutingВОднойИБ

У подписчик error - одна строка (только error). У подписчик все - две; порядок error/info внутри «все» может поменяться - важнее набор тел, не порядок строк.

 

Результат

Перешли с «всем всё» на выборочную доставку: direct-exchange и точное совпадение binding key ↔ routing key.

Дальше - часть 5: шаблоны ключей (* / #), exchange topic.

 

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

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

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

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

RabbitMQ КлиентRMQ Routing direct ключ маршрутизации routing key обменник binding уровень важности error AMQP 1CRabbitMQ интеграция подписка

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

  • 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
Для отправки сообщения требуется регистрация/авторизация