Интеграция решений на 1С и сервиса обмена данными RabbitMQ через Web REST API

Публикация № 1142359

Разработка - Системная интеграция - Внешние источники данных

RabbitMQ REST API HTTP AMQP Сообщения Интеграция Очередь Обмен ESB Программирование WEB HelloWorld RMQ JSON POST Сериализация

Отправка "Hello world" из 1С на сервер RabbitMQ и обратно при помощи web REST API. Проще уже некуда! Совместимо с Linux и Windows! Реализация протестирована на 1С 8.3.14.1854 (x64).

WARNING

Данная статья не претендует на оригинальность и не является конечным решением.
Подходы решения задач и примеры программного кода несут исключительно обучающий характер.

 

Описание:
В этой статье описан способ реализации интеграции с брокером сообщений RabbitMQ через веб интерфейс REST API.
На данный момент вендор не рекомендует использование веб-интерфейса в качестве основного протокола обмена, следующее сообщение можно встретить в мануалах по RabbitMQ:

Please note that the get path in the HTTP API is intended for diagnostics etc - it does not implement reliable delivery and so should be treated as a sysadmin's tool rather than a general API for messaging.

Исходя из того, что вариантов для подключения и обмена данными с RMQ не так уж и много, а если вдруг у нас платформа на Linux - то вообще нет, считаю, что это выход. Также это единственный способ отправки сообщений предоставляющий возможность использовать маршрутизацию по "заголовкам".

Немного теории:

Сам по себе сервер RabbitMQ обычно не устанавливают. Почти всегда в дополнение ставят еще и модуль веб администрирования всего сервиса. Именно модуль администрирования имеет встроенное REST API, выступающее прослойкой между сервером AMQP и миром WEB.

Подробное описание REST API https://bulldog.rmq.cloudamqp.com/api/index.html

Итак, начнем:

Для тестирования API сделал обработку с одной командой - выполнить тестирование:

Здесь указаны настройки подключения к серверу:

Краткое описание работы:

  1. Создание подключения к веб серверу администрирования RabbitMQ;
  2. Создание базовой структуры параметров сообщения для отправки, исходя из REST API;
  3. Сериализация параметров в JSON;
  4. Отправка JSON в POST запросе на север RabbitMQ;
  5. Проверка удачной отправки сообщения;
  6. Подготовка параметров запроса для получения сообщения;
  7. Сериализация параметров запроса в JSON;
  8. Отправка JSON в POST запросе на сервер RabbitMQ;
  9. Обработка ответа сервера.

Код команды:

&НаСервере
Процедура ВыполнитьТестНаСервере()
	
	// Cодать новое соединение с веб-сервером RabbitMQ
	ИнтернетПрокси = Новый ИнтернетПрокси();
	ЗащищенноеСоединениеOpenSSL = Новый ЗащищенноеСоединениеOpenSSL();
	HTTPСоеинение = Новый HTTPСоединение(АдресСервера, Порт, ИмяПользователя, Пароль, ИнтернетПрокси, 360, ЗащищенноеСоединениеOpenSSL, Ложь);
	
	////
	//  Подготовим и отправим сообщение в RabbitMQ
	////****************************************************//
	
	// новое соответствие заголовков
	// если обмен поддерживает адресацию по заголовкам то заполняем
	// заполнять имя маршрута в таком случае не нужно
	ЗаголовкиСообщения = Новый Соответствие;
	Для Каждого СтрокаЗаголовок Из Заголовки Цикл
		ЗаголовкиСообщения.Вставить(СтрокаЗаголовок.Ключ, СтрокаЗаголовок.Значение);
	КонецЦикла;
	
	// новые параметры сообщения
	ПараметрыСообщения = Новый Структура("app_id, correlation_id, delivery_mode, content_type, headers");
	ПараметрыСообщения.headers = ЗаголовкиСообщения;
	ПараметрыСообщения.app_id = Метаданные.Синоним;  // кто отправил
	ПараметрыСообщения.correlation_id = Строка(Новый УникальныйИдентификатор()); // уникальный идентификатор сообщения
	ПараметрыСообщения.delivery_mode = 2; // где будет храниться сообщение 1 - оператива, 2 - диск
	ПараметрыСообщения.content_type = "text/plain"; // тип содержимого
	
	// структура отправки
	СтурктураСообщения = Новый Структура("properties, routing_key, payload, payload_encoding");
	СтурктураСообщения.properties = ПараметрыСообщения;
	СтурктураСообщения.payload_encoding = "string"; // тип содержимого, по умолчанию строка
	СтурктураСообщения.payload = Сообщение; // содержимое
	СтурктураСообщения.routing_key = ИмяМаршрута;  // имя маршрута, пустое если заполнены заголовки сообщения
	
	// сериализовать все параметры запроса в json
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, СтурктураСообщения);
	СтрокаЗапроса = ЗаписьJSON.Закрыть();
	
	// новый запрос REST API для RABBITMQ
	ЗаголовкиЗапроса = Новый Соответствие; 
	ЗаголовкиЗапроса.Вставить("Content-Type", "application/json"); // тип содержимого - json
	HTTPЗапрос = Новый HTTPЗапрос(СтрШаблон("/api/exchanges/%1/%2/publish", Хост, ИмяОбмена), ЗаголовкиЗапроса);
	HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапроса);
	
	// отправить сообщение в RabbitMQ POST запросом
	HTTPОтвет = HTTPСоеинение.ОтправитьДляОбработки(HTTPЗапрос);
	
	// если ошибка сообщим результат
	Если HTTPОтвет.КодСостояния <> 200 Тогда
		Сообщить(СтрШаблон("Код ответа: %1", HTTPОтвет.КодСостояния));
		Сообщить(HTTPОтвет.ПолучитьТелоКакСтроку());
		Возврат;
	КонецЕсли;
	
	////
	//  Получим сообщение из RabbitMQ
	////****************************************************//
	
	// новая структура запроса сообщений из rabbitmq
	СтурктураЗапроса = Новый Структура("count, ackmode, encoding, truncate");
	СтурктураЗапроса.truncate = 10000000; // выгружать сообщения не превышающие этот размер в байтах
	СтурктураЗапроса.encoding = "auto"; // содержимое какого типа мы хотим получить
	СтурктураЗапроса.ackmode = "ack_requeue_false"; // удалить полученные сообщения
	СтурктураЗапроса.count = 1;  // количество запрошеных сообщений
	
	// сериализовать все параметры запроса в json
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, СтурктураЗапроса);
	СтрокаЗапроса = ЗаписьJSON.Закрыть();
	
	// новый запрос REST API для RABBITMQ
	ЗаголовкиЗапроса = Новый Соответствие; 
	ЗаголовкиЗапроса.Вставить("Content-Type", "application/json"); // тип содержимого - json
	HTTPЗапрос = Новый HTTPЗапрос(СтрШаблон("/api/queues/%1/%2/get", Хост, ИмяОчереди), ЗаголовкиЗапроса);
	HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапроса);
	
	// Получить сообщения из RabbitMQ ответом на POST запрос
	HTTPОтвет = HTTPСоеинение.ОтправитьДляОбработки(HTTPЗапрос);
	
	// если ошибка сообщим результат
	Если HTTPОтвет.КодСостояния <> 200 Тогда
		Сообщить(СтрШаблон("Код ответа: %1", HTTPОтвет.КодСостояния));
		Сообщить(HTTPОтвет.ПолучитьТелоКакСтроку());
		Возврат;
	КонецЕсли;
	
	// Прочитаем ответ сервера
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
	СтурктураHTTPОтвета = ПрочитатьJSON(ЧтениеJSON);
	ЧтениеJSON.Закрыть();
	
	// выделим содержимое сообщения
	Ответ = СтурктураHTTPОтвета[0].payload;
	
КонецПроцедуры

Производительность решения:

Действие Количество Время Объем Комментарий
Отправка 1000 1 минута 1335 байт каждое сообщение В качестве сообщений взят
Lorem ipsum из вики
Прием 1000 3 секунды 1335 байт каждое сообщение

 

Вывод: это самый простой способ обмениваться сообщениями с RabbitMQ, используя исключительно встроенные возможности 1С Предприятие, которые доступны во всех версиях платформы.

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. Region102 22.10.19 08:54 Сейчас в теме
Наконец-то можно будет затестить с мобильной платформой. Как раз клиент интересовался по поводу высоконагруженной системы, до 10 000 запросов в час. А то я не уверен, что http сервис 1С это выдержит.
2. user1166203 22.10.19 09:11 Сейчас в теме
(1)
3 запроса в секунду? Ну, в пике 10-20. Странные у вас сомнения :)
7. Region102 22.10.19 17:08 Сейчас в теме
(2) а кто сказал, что нагрузка будет распределенной во времени. Там может и за минуту столько быть, а может и за час 2-3 запроса. Вопрос отказоустойчивости системы, при этом каждый запрос должен создать и провести по регистрам типовой документ, сможет это 1С или нет, вот в чем вопрос.
3. yaroslavkravets 22.10.19 10:26 Сейчас в теме
Rest API RMQ не имеет гарантии доставки. для того чтобы затестить - подойдеть. но для большого проекта нужно смотреть в сторону amqp
4. Eret1k 768 22.10.19 12:50 Сейчас в теме
(3)где именно в технической документации вендора написано, что нет гарантии доставки?
5. yaroslavkravets 22.10.19 15:03 Сейчас в теме
(4) https://www.rabbitmq.com/management.html#http-api-monitoring
The API is intended to be used for monitoring and alerting purposes. It provides access to detailed information about the state of nodes, connections, channels, queues, consumers, and so on.
9. Eret1k 768 22.10.19 19:46 Сейчас в теме
(5) это просто предупреждение и о нем Я писал выше.
Сервер amqp поддерживает соединение в течении нескольких часов и может передать сотни тысяч сообщений за сеанс.
Естественно web это не потянет, но при обмене сотней другой сообщений с короткими перерывами это самое то.
6. yaroslavkravets 22.10.19 15:05 Сейчас в теме
Для получения данных из очереди нужно спрашивать кролик - есть ли изменения?
8. Eret1k 768 22.10.19 19:41 Сейчас в теме
(6) да нужно, делаем регламентное задание и каждые к примеру 5 минут опрашиваем, есть ли сообщения.
15. comol 4298 22.05.20 19:18 Сейчас в теме
(8) Лучше вот так:
https://infostart.ru/public/1116609/
Фоновое задание по расписанию зашквар ИМХО.
Если хочется http нативно - используйте kafka - там оно уже нормально работает.
17. oleganatolievich 145 23.05.20 10:33 Сейчас в теме
(15) confluent kafka rest? полгода назад были лютые тормоза по 30 секунд на последней версии кафки. пришлось свой rest поднимать. сейчас такого нет?
18. comol 4298 23.05.20 14:25 Сейчас в теме
(17) И год назад меньше секунды была обработка. "вы просто не умеете готовить kafka" (с)
19. oleganatolievich 145 23.05.20 14:50 Сейчас в теме
(18) ну конечно же, 2 года на ней сижу и не умею готовить.
20. comol 4298 23.05.20 23:21 Сейчас в теме
(19) Ну вот, обидки, минусы сразу... просто ни у меня ни у товарищей с DNS которые это как выяснилось тоже юзают проблем с 30 секундным ожиданием не выяснялось. Более того, в этом году на HighLoad++ ребята из того самого Confluent рассказывали что из Rest вполне себе Production и никаких там особо ограничений нет. Я могу сказать более политкорректно - "видимо это был ваш конкретный кейс" но суть об этого не изменится. Без обид, нормально confluent kafka работает. По крайней мере уж точно лучше чем RabbitMQ Rest
21. oleganatolievich 145 23.05.20 23:57 Сейчас в теме
(20) проблема вылезла именно после обновления на свежий релиз confluent rest, до него по скорости замечаний не было. с нашими объемами, по 10 млн записей в одну сторону, не было времени разбираться. мы сделали свой REST на flask.
10. Feelthis 36 24.10.19 08:57 Сейчас в теме
На моем опыте среди клиентов для Rabbit MQ на Node js - самый эффективный. Особенно если у вас высоконагруженный проект. Если к примеру мы читаем из Rabbit в сторону 1С (подключаемся по http сервисам), далее данные просто сохраняем в справочник, то клиент на node может считать и загрузить 100-150 сообщений в сек. Клиентом на C# мне не удалось такого достичь (не знаю есть ли там асинхронность не силен в C#). Использовать Web REST API вряд ли подойдет для скорости..
"Исходя из того, что вариантов для подключения и обмена данными не так уж и много, а если вдруг у нас платформа на Linux - то вообще нет, считаю, что это выход" - вот тут вообще не понял что хотели сказать в статье.
11. starik-2005 2154 24.10.19 10:56 Сейчас в теме
(10)
то клиент на node может считать и загрузить 100-150 сообщений в сек
Вот тут некто пишет, что достигал куда более весомого результата обычным курлом вроде как...Может быть в железяге дело.

С другой тороны, я на REDIS'е, который тоже умеет очереди, через именованные каналы даже на пыхе получал в районе 100к запросов в секунду... Но это райзен 1600-й, а не пентиум голд, конечно...
12. Feelthis 36 24.10.19 12:19 Сейчас в теме
(11)
Имею ввиду, что при замере я включил время записи 1с данных в справочник (чисто запись без всяких проверок) и то что клиент ждет ответ от 1с - успешно ли данные записались. То есть в call back функции обрабатываем ответ, в случае успеха делаем acknowledge, в случае не успеха - обрабатываем ошибки от 1с (например база на обслуживании и прочее) и делаем reject.
Понятно если просто читать сообщения там скорость космическая. Также в случае если мы всегда авто подтверждаем сообщения (без всяких проверок в callback ответах) то скорость тоже будет намного выше.
13. s0nya 21.04.20 22:19 Сейчас в теме
14. vis_tmp 30 25.04.20 14:07 Сейчас в теме
Никак не могу найти, есть ли возможность для 7.7 использовать Rabbit MQ ?
16. SergeyN 754 22.05.20 19:27 Сейчас в теме
Коллеги, это вредная статья. Жирный минус автору. Rest интерфейс кролика не позволяет подтверждать сообщения. Соответственно нет главного достоинства очередей в гарантированной доставке сообщений. Этот интерфейс предназначен для администрирования, а не для работы с очередями. Мой опыт с цифрами по пропускной способности rest и классических библиотек на реальном проекте: https://infostart.ru/public/1234830/
ShiningPhoenix; oleganatolievich; comol; primat; +4 Ответить
22. ShiningPhoenix 9 24.05.20 10:22 Сейчас в теме
RMQ в таком режиме тянет всего 170 запросов в секунду(если не ошибаюсь), нет подтверждения.
Этот режим для сервисных целей.
23. SergeyN 754 25.05.20 11:53 Сейчас в теме
(22) У меня в тестах тоже около 170 получалось даже при многопоточной работе.
24. acteck 25.05.20 21:51 Сейчас в теме
8.3.17
Обмен сообщениями. «Интеграционная шина» может подключаться к приложениям 1С начиная с версии платформы 1С:Предприятие 8.3.17. Также поддерживается обмен по протоколу AMQP и возможно подключение к внешним брокерам сообщений.
MAGDevelopment; +1 Ответить
Оставьте свое сообщение

См. также

daСклонение: склонение ФИО, должностей, чисел, прилагательных, существительных на языке 1С + ТестЦентр Промо

Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

14.02.2015    99313    96    daMaster    88    

Сравнение реального дохода со средним доходом из API.HH.RU

Зарплата Управленческие v8 v8::СПР ЗУП3.x УУ Абонемент ($m)

Внешняя обработка на управляемой форме для 1С:Предприятие 8.3 по интеграции с HH.RU используя HH REST API. Ключевые функции: получение списка вакансий по должностям (Ключ для работы не нужен); расчет среднего дохода; Тестирование проводилось на платформе 1С:Предприятие 8.3 (8.3.13.1513) Зарплата и управление персоналом, редакция 3.1 (3.1.11.68) совместно с API.HH.RU.

1 стартмани

11.11.2019    3679    4    solaru    2    

Конфигурация для рекламного агентства

Управление услугами и сервисом Управление взаимоотношениями с клиентами (СRM) Производство готовой продукции (работ, услуг) Управление взаимоотношениями с клиентами (СRM) Производство готовой продукции (работ, услуг) v8 Реклама, PR и маркетинг УУ Абонемент ($m)

Данная конфигурация выполнена для решения тестового задания: Цель задания: 1) Понять, на каком из клиентов сколько мы заработали;  2) Понять, по какому виду СМИ сколько мы заработали;  3) Проследить по каждой услуге: у кого за сколько купили и кому за сколько продали, с возможностью перейти в соответствующий документ. Реализовано с помощью: 1. Справочники - контрагенты, номенклатура 2. Документы - Поступление услуг, реализация услуг 3. Отчеты - отчет по контрагентам, номенклатуре и движений.

1 стартмани

21.05.2019    3983    0    solaru    0    

Загрузка номенклатуры в УТ 10.3 из Excel файла с генерацией штрихкодов

Загрузка и выгрузка в Excel Обработка справочников Оптовая торговля Розничная торговля Учет ТМЦ Оптовая торговля Розничная торговля Учет ТМЦ v8 УТ10 Россия Абонемент ($m)

Обработка позволяет генерировать новые номенклатурные позиции на основе данных из файла Excel с последующей генерацией штрихкодов (ШК). Может быть полезна при больших поступлениях товаров на склад, где ручное создание и присваивание штрихкода  (ШК) может занимать много времени.

1 стартмани

24.03.2017    7557    6    solaru    0    

Под капотом управляемых форм

Практика программирования v8 1cv8.cf Бесплатно (free)

Управляемые формы уже давно и плотно вошли в жизнь 1С-разработчика. Однако, судя по недавним публикациям на Инфостарте, многие до сих пор мало знакомы с ними. Предлагаю разобраться с тем, что же это такое.

26.08.2013    260928    0    Evil Beaver    266    

[NotaBene] Универсальный отчет по таблице значений

Практика программирования v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Абонемент ($m)

1C v.7.7 Готовое решение. Не требует настройки. Не требует допрограммирования. Данная обработка решает часто встречающуюся задачу вывода в "красивом" виде таблицы значений (полученной, например, из запроса). Поддерживается произвольное группирование данных, отключение/включение группировок, в т.ч и создание "шахматок" (типа "продажи понедельно"). Обработка может использоваться как и в отладочных целях (для нормального просмотра ТЗ), так и в составе вполне рабочих отчетов. По крайней мере, я неоднократно клиентам данную обработку ставил вместо того, чтобы каждый раз писать замороченные выводы данных. И клиенты довольны, и мне - проще...

2 стартмани

07.05.2007    27966    1    CheBurator    61