Руководство 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 1С Клиент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    33870    53    49    

51

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

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

85400 руб.

05.10.2022    14600    17    8    

17

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

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

122000 руб.

19.08.2020    30669    28    3    

29

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

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

85400 руб.

24.04.2017    57689    99    165    

91

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

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

10370 руб.

24.06.2021    26867    66    55    

48

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

Внешняя обработка «Загрузка документов из eФарма» создана для программы 1С:Бухгалтерия предприятия, редакция 3.0 (версии Базовая, Проф и Корп). Обработка позволяет загружать документы в базу 1С из файлов выгрузки, имеющих формат .DBF, которые создаются в программе eФарма или eФарма2, а также из любых других программ, формирующих файлы-выгрузки с таким же расширением.

9760 руб.

15.03.2024    2893    5    0    

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