Руководство RabbitMQ - Часть 5. Topics - маршрутизация по шаблону

06.08.26

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

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

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

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

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

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

 

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

В части 4 direct фильтровал по точному ключу (error, info). Нельзя было сказать: «все логи от kern» и одновременно «все critical, откуда угодно».

Для нескольких измерений в ключе (как источник и уровень важности в syslog) нужен exchange типа topic.

 

 

Topic exchange: слова, * и #

Routing key в topic - не произвольная строка, а слова через точку: kern.critical, stock.usd.nyse, quick.orange.rabbit (до 255 байт). Binding key - в той же форме, плюс два спецсимвола:

  • * (звезда) - ровно одно слово;
  • # (решётка) - ноль или больше слов.

Классический пример оригинала - ключ из трёх слов <скорость>.<цвет>.<вид>:

 

Binding Смысл
.orange. все оранжевые
..rabbit всё про кроликов
lazy.# все «ленивые», любой хвост

 

quick.orange.rabbit попадёт в очереди с .orange. и ..rabbit. quick.brown.fox - никуда. lazy.orange.new.rabbit (четыре слова) совпадёт с lazy.#.

> Topic умеет притворяться другими типами: binding # W76; fanout; bindings без */# W76; direct.

Тип headers здесь не разбираем - для логгера достаточно topic. Кратко: маршрутизация идёт не по routing key, а по заголовкам сообщения (таблица ключU94;значение в свойствах AMQP). Привязка задаёт набор заголовков и правило x-match: all (должны совпасть все) или any (достаточно одного). Именованный headers-exchange создаётся так же, как остальные - ОМ_РМКУ_ManagementAPI.ОбъявитьExchange("имя", "headers"), на брокере есть и встроенный amq.headers. Публикация в КлиентRMQ - через параметр Заголовки у ОпубликоватьСообщение`. Подробнее: Headers exchange.

 

Логгер: <источник>.<уровень>

Рабочее допущение руководства: ключ из двух слов (в оригинале facility / severity). Exchange - topic_logs, объявляем через ОМ_РМКУ_ManagementAPI.ОбъявитьExchange или через Management UI.

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

Публикация:

// Подключение и Канал - как в [части 1](//infostart.ru/1c/articles/2196530/)
// Exchange «topic_logs» уже объявлен через Management API (тип topic)
ТочкаОбмена = "topic_logs";
КлючМаршрутизации = "kern.critical";
ТекстСообщения = "A critical kernel error";

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

Подписка - temporary-очередь + одна или несколько привязок с шаблонами:

ТочкаОбмена = "topic_logs";
ОМ_РМКУ_ManagementAPI.ОбъявитьExchange(ТочкаОбмена, "topic");

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

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

// kern.* и *.critical на одну очередь - повторный ОбъявитьОчередь
Очередь = КлиентRMQ.ОбъявитьОчередь(
	Канал, "", "kern.*", ТочкаОбмена, Ложь, Истина, Истина);
КлиентRMQ.ОбъявитьОчередь(
	Канал, Очередь.ИмяОчереди, "*.critical", ТочкаОбмена, Ложь, Истина, Истина);

 

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

Скелет подписчика ниже; связный прогон и лог - в «Запуск решения». Код - ОМ_ТестRMQ_Lessons.

Как в части 3: АвтоматическоеПодтверждение = Истина у логгера уместен (своя очередь + копия broadcast); для work queue в части 2 нужен ручной ack.

ТочкаОбмена = "topic_logs";
ОМ_РМКУ_ManagementAPI.ОбъявитьExchange(ТочкаОбмена, "topic");
Шаблоны = СтрРазделить("kern.*,*.critical", ",");

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

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

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

Поэкспериментируйте с ключами длиннее двух слов - код ничего жёстко не предполагает про формат.

 

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

Как в части 4: при ручном демо сначала слушатели с нужными шаблонами binding, потом отправка сообщений.

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

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

// smoke: topic_logs U94; kern.* + *.critical U94; emit kern.info / kern.critical / app.critical
ОМ_ТестRMQ_Lessons.Урок5_TopicsВОднойИБ();

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

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

… | Старт | очередь: часть5_topics | данные: Урок5_TopicsВОднойИБ
… | Отправка в очередь | очередь: часть5_topics | данные: kern.info | kern.info:a1b2c3d4
… | Отправка в очередь | очередь: часть5_topics | данные: kern.critical | kern.critical:a1b2c3d4
… | Отправка в очередь | очередь: часть5_topics | данные: app.critical | app.critical:a1b2c3d4
… | Получение из очереди | очередь: часть5_topics | данные: подписчик kern | kern.info:a1b2c3d4
… | Получение из очереди | очередь: часть5_topics | данные: подписчик kern | kern.critical:a1b2c3d4
… | Получение из очереди | очередь: часть5_topics | данные: подписчик critical | kern.critical:a1b2c3d4
… | Получение из очереди | очередь: часть5_topics | данные: подписчик critical | app.critical:a1b2c3d4
… | Окончание | очередь: часть5_topics | данные: Урок5_TopicsВОднойИБ

У подписчик kern нет app.critical. У подписчик critical нет kern.info. Порядок двух строк внутри одной метки может чуть съехать - важнее набор тел по меткам.

 

Результат

Настроили гибкую маршрутизацию по шаблону: topic-exchange, * и # в binding key.

Дальше - часть 6: запрос–ответ (RPC) и свойства сообщения (reply_to, correlation_id).

 

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

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

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

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

RabbitMQ КлиентRMQ Topics topic шаблон routing key wildcard обменник binding источник уровень 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
Для отправки сообщения требуется регистрация/авторизация