Содержание:
- Direct Exchange (Прямой обменник)
- Fanout Exchange (Веерный обменник) при работе в системе 1С
- Topic Exchange (Тематический обменник) в системе программ 1С
- Headers Exchange (Заголовочный обменник) в учетной системе 1С
Когда мы начинаем использовать RabbitMQ, мы отправляем сообщения не напрямую в очередь, а в сущность под названием обменник (Exchange). Обменник — это своего рода “распределительный центр” или “сортировочный узел”. Его единственная задача — получить сообщение от издателя (например, от 1С) и решить, в какие очереди его направить. А вот правила, по которым он принимает это решение, и определяют его тип.
Связь между обменником и очередью называется связкой (Binding). Именно в ней задаются критерии, по которым сообщения попадают в очередь. Издатель (1С) публикует сообщение с определенным ключом маршрутизации (Routing Key). Обменник сравнивает этот ключ с ключами, указанными в связках, и на основе этого принимает решение.
Правильный выбор типа обменника (топологии) — это не техническая мелочь, а ключевое архитектурное решение. Давайте разберем четыре основных типа и поймем, когда и какой из них использовать в контексте задач 1С.
Direct Exchange (Прямой обменник)
Как работает: Это самый простой тип. Он направляет сообщение в те очереди, у которых ключ связки (binding key) в точности совпадает с ключом маршрутизации (routing key) сообщения. Если сообщение отправлено с ключом pdf_reports, оно попадет только в те очереди, которые были связаны с обменником с ключом pdf_reports.
Когда использовать в 1С:
- Распределение задач по конкретным обработчикам. Представьте, у вас есть “тяжелые” задачи двух типов: формирование аналитических отчетов и массовая рассылка email. Вы можете создать две очереди: heavy_reports_queue и bulk_email_queue.
- Когда 1С нужно сформировать отчет, она отправляет сообщение с ключом reports. Обменник направит его в heavy_reports_queue.
- Когда нужно сделать рассылку — с ключом emails в bulk_email_queue.
- Четкое разделение потоков данных. Вы гарантированно знаете, что задача одного типа попадет только к своему обработчику. Это простая и надежная схема для целевой доставки “точка-точка” в асинхронном режиме.
Fanout Exchange (Веерный обменник) при работе в системе 1С
Как работает: Этот тип обменника полностью игнорирует ключ маршрутизации. Он просто берет входящее сообщение и отправляет его копию во все связанные с ним очереди без исключения.
Когда использовать в 1С:
- Оповещение всех подсистем о глобальном событии. Например, в 1С изменился ключевой параметр учетной политики или курс валют. Это событие может быть важно одновременно для нескольких систем: для CRM (чтобы пересчитать стоимость сделок), для сайта (чтобы обновить цены) и для системы аналитики. 1С публикует одно сообщение в Fanout-обменник, и все заинтересованные системы гарантированно получают его копию.
- Сброс кэша. Если в 1С изменились данные о номенклатуре, и нужно, чтобы все внешние системы (сайт, мобильное приложение) сбросили свой кэш по товарам, Fanout — идеальный способ разослать команду “Очистить кэш” всем и сразу.
Topic Exchange (Тематический обменник) в системе программ 1С
Как работает: Это самый гибкий и мощный тип. Он направляет сообщения на основе шаблонного совпадения ключа маршрутизации с ключом связки. Ключи здесь имеют иерархическую структуру, где слова разделены точками (например, region.department.event). В ключах связки можно использовать два спецсимвола:
- * (звездочка) — заменяет ровно одно слово.
- # (решетка) — заменяет ноль или более слов.
Когда использовать в 1С:
Это основной инструмент для построения сложных Event-Driven Architectures.
- Пример: Обработка документов.
- 1С создает документ “Реализация товаров и услуг” для склада в Москве и публикует сообщение с ключом docs.sales.created.moscow.
- Складская система Москвы подписана на ключ docs.sales.created.moscow и получает это сообщение для отгрузки.
- Бухгалтерия хочет видеть все созданные документы реализации, независимо от города. Она подписывается на docs.sales.created.#.
- Система аналитики хочет отслеживать все операции с документами (создание, изменение, удаление) по всем складам. Она подписывается на docs.#.
- Система логистики интересуется только созданием и проведением документов реализации и заказов по всем городам. Она может иметь две связки: docs.sales.*.moscow и docs.orders.*.moscow.
Topic Exchange позволяет разным системам подписываться на разные срезы одного и того же потока событий, не требуя от 1С никаких изменений. 1С просто подробно описывает событие в ключе маршрутизации.
Headers Exchange (Заголовочный обменник) в учетной системе 1С
Как работает: Этот тип полностью игнорирует ключ маршрутизации и принимает решение о маршрутизации на основе заголовков (headers) сообщения — это набор пар “ключ-значение”. В связке указывается, каким заголовкам должно соответствовать сообщение. Есть специальный аргумент x-match, который может иметь значение all (все заголовки должны совпасть) или any (достаточно совпадения хотя бы одного).
Когда использовать в 1С:
Этот тип используется редко, так как маршрутизация по темам (Topic) обычно более интуитивна. Однако он полезен, когда критерии маршрутизации не укладываются в иерархическую структуру ключей.
- Пример: Вы отправляете задачи на печать. Сообщение может иметь заголовки: format: “pdf”, color: “true”, priority: “high”.
- Один принтер (очередь) может быть настроен на прием всех срочных заданий (связка priority=”high”, x-match=”any”).
- Другой, цветной, — на прием всех цветных заданий (связка color=”true”, x-match=”any”).
- Третий, самый мощный, — только на срочные цветные PDF (связка format=”pdf”, color=”true”, priority=”high”, x-match=”all”).
Выбор топологии — это ответ на вопрос: “Как будут доставляться мои сообщения?”.
- Нужна простая, целевая доставка? Берите Direct.
- Нужно оповестить всех и сразу? Используйте Fanout.
- Строите гибкую, событийно-ориентированную систему, где разные потребители интересуются разными срезами данных? Ваш выбор — Topic. Это наиболее универсальный и масштабируемый вариант для большинства сложных интеграций 1С.
- Ваша логика маршрутизации основана на множественных, неиерархических атрибутах? В редких случаях вам может помочь Headers.
Специалист компании ООО “Кодерлайн”,
Астанов Артём
Добавить комментарий