DaJet Stream: RabbitMQ

17.03.24

Интеграция - WEB-интеграция

Команды CONSUME и PRODUCE языка запросов DaJet Stream

Основная статья про DaJet Stream

DaJet Stream: Apache Kafka

DaJet Stream: HTTP сервисы

Видео: основы DaJet Stream

Видео: знакомство с платформой DaJet

Дистрибутив DaJet 3.3.3 на GitHub

Команды CONSUME и PRODUCE в языке запросов DaJet Stream предназначены для организации потокового обмена данными (сообщениями), в том числе, например, с такими брокерами сообщений, как RabbitMQ.

Команда CONSUME работает с брокерами сообщений в режиме PUSH от сервера, то есть постоянно находится в режиме ожидания входящих сообщений от брокера. Однако, следует иметь в виду, что при работе с таблицами-очередями баз данных (смотри основную статью про DaJet Stream) процессор скриптов DaJet Stream, обрабатывая команду CONSUME, реализует паттерн pooling publisher, который используется совместно с паттерном transactional outbox. Это означает, что DaJet Stream работает с базой данных в режиме PULL на клиенте, реализуя так называемое деструктивное чтение. То есть сообщения удаляются из таблицы-очереди после их отправки получателю в транзакции. Таким образом, можно сказать, что команда CONSUME выполняет своего рода роль координатора распределённой транзакции, обеспечивая требования ACID для каждого пакета данных.

В любом случае, как для брокеров сообщений, так и для баз данных, DaJet Stream гарантирует доставку сообщений на уровне at-least-once-in-order (минимум один раз строго по порядку). Возможную дупликацию сообщений DaJet Stream не контроллирует. Для этого следует использовать, либо логику приложения, либо возможности брокера.

Важно! Все команды CONSUME, как для баз данных, так и для брокеров сообщений, подразумевают "бесконечное" потребление потока данных с автоматическим восстановлением подключений к своим источникам в случае их разрыва.

Ниже приведённые скрипты DaJet Stream демонстрируют основные сценарии использования адаптера RabbitMQ при помощи команд CONSUME и PRODUCE, используя возможные, но не обязательные для всех случаев, варианты настройки. Для вашего конкретного сценария лучше всего предварительно изучить официальную документацию разработчиков RabbitMQ.

Важно! DaJet Stream ориентируется на использование текстовых сообщений в кодировке UTF-8.

Выполнение скрипта в среде Windows Выполнение скрипта в среде Linux

(из корневого каталога установки)

dajet stream --file ./stream/script.sql

(из корневого каталога установки)

dotnet ./dajet.dll stream --file ./stream/script.sql

1. Простая отправка сообщения в RabbitMQ ("консольный" вариант)

-- ****************************************************************************
-- * Приёмник сообщений RabbitMQ, виртуальный хост dajet, топик test-exchange *
-- ****************************************************************************

PRODUCE 'amqp://guest:guest@localhost:5672/dajet'
   WITH Exchange   = 'test-exchange' -- Наименование топика
      , RoutingKey = 'AAA'           -- Ключ маршрутизации
      , CarbonCopy = 'BBB,CCC,DDD'   -- Дополнительные ключи маршрутизации (csv)
      , MessageId  = 'msg-no-1234'   -- Идентификатор сообщения
 SELECT AppId       = 'test sender'            -- Отправитель
      , Type        = 'Тестовый тип сообщения' -- Тип сообщения
      , Body        = 'Тестовое сообщение'     -- Тело сообщения
      , ContentType = 'text/plain'

Доступные свойства исходящего сообщения для RabbitMQ (команда PRODUCE)

Свойство Тип данных Описание
AppId string Наименование отправителя
Exchange string Наименование топика
RoutingKey string

Ключ маршрутизации, если свойство Exchange заполнено.

В противном случае - наименование очереди для прямой отправки в очередь без маршрутизации.

Mandatory number

Признак обязательности наличия очереди назначения. Подробнее лучше почитать в документации RabbitMQ.

По умолчанию DaJet Stream не использует этот флаг.

MessageId string Идентификатор сообщения
BlindCopy string (csv) Дополнительные ключи маршрутизации. Значения ключей не доставляются получателю.
CarbonCopy string (csv) Дополнительные ключи маршрутизации. Значения ключей доставляются получателю. Использовать не рекомендуется.
Type string Тип сообщения
Body string Тело сообщения. DaJet Stream ориентируется на текстовые сообщения в кодировке UTF-8.
ContentType string

Тип содержимого тела сообщения.

Значение по умолчанию: application/json

ContentEncoding string

Формат (кодировка) тела сообщения.

Значение по умолчанию: UTF-8

DeliveryMode number

Вид доставки: 1 - in-memory, 2 - persistent.

Значение по умолчанию: 2 (сохранение на диск)

Priority number

Приоритет доставки сообщения от 0 до 9.

Значение по умолчанию: 0

ReplyTo string Адресат для обратной связи, определяемый логикой приложения.
CorrelationId string Идентификатор корреляции сообщений между собой, определяемый логикой приложения.
Expiration string Спецификация устаревания сообщения. Подробнее лучше почитать в документации RabbitMQ. По умолчанию не используется.

2. Отправка сообщений: регистр сведений - RabbitMQ

DECLARE @message  object -- Запись (сообщение) таблицы-очереди
DECLARE @empty_uuid uuid = "00000000-0000-0000-0000-000000000000"

-- ***********************************************************************
-- * Источник сообщений SQL Server - регистр сведений "ИсходящаяОчередь" *
-- ***********************************************************************
USE "mssql://zhichkin/dajet-exchange"

DECLARE @Отправитель string = SELECT Код
                                FROM ПланОбмена.ПланОбменаРИБ
                               WHERE Предопределённый <> @empty_uuid

CONSUME TOP 1000
        НомерСообщения, ТипСообщения, ТелоСообщения
   INTO @message
   FROM РегистрСведений.ИсходящиеСообщения
  ORDER BY НомерСообщения ASC

-- ****************************************************************************
-- * Приёмник сообщений RabbitMQ, виртуальный хост dajet, топик test-exchange *
-- ****************************************************************************

PRODUCE 'amqp://guest:guest@localhost:5672/dajet'
   WITH AppId     = @Отправитель
 SELECT Type      = @message.ТипСообщения
      , Body      = @message.ТелоСообщения
      , Exchange  = 'test-exchange'
      , MessageId = @message.НомерСообщения

 

Доступные настройки для получения входящих сообщений от RabbitMQ (команда CONSUME)

Свойство Тип данных Описание
QueueName string Наименование очереди для получения сообщений
Heartbeat number Период проверки в секундах наличия подключения к RabbitMQ. В случае его потери - автоматическое восстановление. Кроме этого данное значение используется для периодического вывода количества обработанных (успешно полученных) за это время сообщений в консоль или журнал DaJet Stream.
PrefetchSize number

Размер клиентского буфера в байтах.

Значение по умолчанию: неограниченно.

Подробнее лучше почитать в документации RabbitMQ.

PrefetchCount number

Количество сообщений, которые могут быть отправлены сервером без подтверждения.

Значение по умолчанию: 1.

Значение 1 выбрано DaJet Stream для обеспечения гарантий доставки at-least-once-in-order.

Подробнее лучше почитать в документации RabbitMQ.

3. Получение сообщений: RabbitMQ - регистр сведений

DECLARE @source  string = 'guest:guest@localhost:5672/dajet'
DECLARE @target  string = 'postgres:postgres@127.0.0.1:5432/dajet-demo-pg'
DECLARE @message object -- Данные входящего сообщения RabbitMQ

-- ***************************************************************************
-- * Источник сообщений RabbitMQ, виртуальный хост dajet, очередь test-queue *
-- ***************************************************************************

CONSUME 'amqp://{@source}'
   WITH QueueName = 'test-queue', Heartbeat = 5
   INTO @message

-- ************************************************************************
-- * Приёмник сообщений Postgre SQL - регистр сведений "ВходящиеСообщения" *
-- ************************************************************************
USE 'pgsql://{@target}'

INSERT РегистрСведений.ВходящиеСообщения
SELECT НомерСообщения = VECTOR('so_incoming_queue')
     , ОтметкаВремени = NOW()
     , Отправитель    = @message.AppId
     , ТипСообщения   = @message.Type
     , ТелоСообщения  = @message.Body
     , Получатели     = @message.ContentType

 

4. DaJet Stream RabbitMQ Shovel

Ниже приводится пример скрипта получения сообщений из одной очереди RabbitMQ и их отправки в другую очередь или топик RabbitMQ средствами DaJet Stream. По сути своей это аналог плагина Shovel для RabbitMQ. При этом очереди могут находиться на разных серверах RabbitMQ - нужно только поменять соответствующие адреса подключений в командах CONSUME и PRODUCE скрипта DaJet Stream.

DECLARE @source  string = 'guest:guest@localhost:5672/dajet'
DECLARE @target  string = 'guest:guest@localhost:5672/dajet'
DECLARE @message object -- Объект сообщения RabbitMQ

-- ***************************************************************************
-- * Источник сообщений RabbitMQ, виртуальный хост dajet, очередь test-queue *
-- ***************************************************************************

CONSUME 'amqp://{@source}'
   WITH QueueName = 'test-queue', Heartbeat = 5
   INTO @message

-- ****************************************************************************
-- * Приёмник сообщений RabbitMQ, виртуальный хост dajet, очередь test-shovel *
-- ****************************************************************************
PRODUCE 'amqp://{@target}'
 SELECT AppId      = @message.AppId
      , Type       = @message.Type
      , Body       = @message.Body
      , RoutingKey = 'test-shovel'
      , MessageId  = @message.MessageId

 

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

DaJet Stream обмен данными интеграция RabbitMQ

См. также

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM / LOGICSTARS. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM / LOGICSTAR разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    21852    31    24    

25

SALE! 15%

WEB-интеграция Программист Бизнес-аналитик 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

17280 14688 руб.

20.12.2024    4064    20    2    

21

WEB-интеграция Программист Руководитель проекта 1С v8.3 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки. Основные преимущества: 1. Документация API создаётся автоматически. Удобна для программной обработки. 2. Изменить API столь же просто как настроить отчёт. Можно опубликовать существующий вариант отчёта. 3. Отчёты в API поддерживают параметры (Период, ДатаНачала и др.) 4. При создании простых методов не требуется изменять конфигурацию. 5. Поддерживается работа с планами обмена.<br/> 6. Возможно настроить отправку из 1С данных корреспондирующей системе, для случаев когда 1С сама "знает" какие данные нужно отправить. 7. После записи в 1С Ле Мурр может возвращать соответствие полученных идентификаторов созданным в 1С объектам данных.

36000 руб.

27.09.2024    8962    7    5    

10

Оптовая торговля WEB-интеграция Бюджетный учет Обмен с ГосИС Бухгалтер Пользователь 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Государственные, бюджетные структуры Россия Бухгалтерский учет Управленческий учет Платные (руб)

Обмен данными с "Порталом поставщиков" zakupki.mos.ru Москвы и Московской области с целью создания оферт для закупок государственными учреждениями. Модуль устраняет рутину, минимизирует ошибки и помогает выигрывать больше закупок. Работает строго по требованиям 44-ФЗ.

14400 руб.

13.12.2016    41375    54    39    

37

Обмен с ГосИС WEB-интеграция Бухгалтер Пользователь 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

5196 руб.

28.04.2016    98365    111    218    

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