|

Выбор топологии RabbitMQ для интеграции с 1C: Direct, Fanout, Topic, Header


Содержание:

  1. Direct Exchange (Прямой обменник)
  2. Fanout Exchange (Веерный обменник) при работе в системе 1С
  3. Topic Exchange (Тематический обменник) в системе программ 1С
  4. 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.

Специалист компании ООО “Кодерлайн”,

Астанов Артём


Помогла ли вам статья? Оставьте свой комментарий:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Блог про 1С:Предприятие

Copyright © 2024 TopKoder

Мы занимаемся внедрением и обслуживанием программных продуктов 1С.