Руководство RabbitMQ - 1. Hello World

26.09.24

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

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

Предпосылки

Как и в других руководствах по 1С, мы будем использовать компоненту PinkRabbitMQ версии 2.2.0.37.

 
 Настройки RabbitMQ сервера

Введение

RabbitMQ - это средство обмена сообщениями: оно принимает и пересылает сообщения. Вы можете рассматривать его как почтовое отделение: когда вы опускаете письмо, которое хотите отправить, в почтовый ящик, вы можете быть уверены, что почтальон в конечном итоге доставит его вашему получателю. В этой аналогии RabbitMQ - это почтовый ящик, почтовое отделение и почтальон.

Основное различие между RabbitMQ и почтовым отделением заключается в том, что он не работает с бумагой, а принимает, хранит и пересылает двоичные блоки данных R10; сообщения (messages).

RabbitMQ и система обмена сообщениями в целом используют некоторый жаргон.

  • Производящий (Producing) означает не что иное, как отправку. Программа, которая отправляет сообщения, является производителем (producer):

  • Очередь (queue) - это название почтового ящика в RabbitMQ. Хотя сообщения передаются через RabbitMQ и ваши приложения, они могут храниться только внутри очереди. Очередь ограничена только объемом памяти и диска хоста, по сути, это большой буфер сообщений.

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

Вот как мы представляем очередь:

  • Потребление (Consuming) имеет то же значение, что и получение. Потребитель (consumer) - это программа, которая в основном ожидает получения сообщений:

Обратите внимание, что производитель (producer), потребитель (consumer) и посредник (broker) не обязательно должны находиться на одном хосте; на самом деле, в большинстве приложений это не так. Приложение также может быть как производителем, так и потребителем.

Приветствую, мир!

В этой части урока мы напишем две небольшие программы: программу-производителя (отправителя), которая отправляет одно сообщение, и программу-потребителя (receiver), которая получает сообщения и распечатывает их. Это "Привет, мир" обмена сообщениями.

На приведенной ниже диаграмме "P" - это наш производитель, а "C" - наш потребитель. Поле посередине представляет собой очередь - буфер сообщений, который RabbitMQ хранит от имени потребителя.

Наш общий дизайн будет выглядеть следующим образом:

Производитель отправляет сообщения в очередь "hello". Пользователь получает сообщения из этой очереди.

Отправка

Наша первая программа отправит в очередь одно сообщение. Первое, что нам нужно сделать, это установить соединение с сервером RabbitMQ.

&НаКлиенте
Процедура Отправка(Команда)
	
	Сервер = "192.168.57.2";
	Порт = 5672;
	Пользователь = "rmuser";
	Пароль = "rmpassword";
	ВиртуальныйХост = "/";
		
	КлиентКомпоненты = ПолучитьКомпонентуКлиент();
	
	КлиентКомпоненты.Connect(Сервер, Порт, Пользователь, Пароль, ВиртуальныйХост);
	
...

Функцию ПолучитьКомпонентуКлиент() можно получить из демонстрационной обработки //infostart.ru/1c/tools/1099423/

Теперь мы подключены к брокеру на компьютере "192.168.57.2". Если бы мы хотели подключиться к брокеру на другом компьютере, мы бы просто указали здесь его имя или IP-адрес.

RabbitMQ - это мультитенантная система: соединения, обмены, очереди, привязки, разрешения пользователей, политики и некоторые другие функции принадлежат виртуальным хостам, логическим группам объектов. Если вы знакомы с виртуальными хостами в Apache или серверными блоками в Nginx, идея аналогична. Более подробно в документации.

Далее, перед отправкой нам нужно убедиться, что очередь получателей существует. Если мы отправим сообщение в несуществующее местоположение, RabbitMQ просто удалит сообщение. Давайте создадим очередь hello, в которую будет доставлено сообщение:

ИмяОчереди = "hello";
Клиент.DeclareQueue(ИмяОчереди, Ложь, Ложь, Ложь, Ложь);

На данный момент мы готовы к отправке сообщения. Наше первое сообщение будет содержать просто строку "Hello World!" и мы хотим отправить его в нашу очередь hello.

В RabbitMQ сообщение никогда не может быть отправлено непосредственно в очередь, оно всегда должно пройти процедуру обмена (exchange). Но давайте не будем углубляться в подробности вы можете прочитать больше об обменах в третьей части этого руководства. Все, что нам нужно знать сейчас, это как использовать обмен данными по умолчанию, обозначаемый пустой строкой. Этот обмен является "особенным" он позволяет нам точно указать, в какую очередь должно быть отправлено сообщение. Имя очереди должно быть указано в параметре routing_key:

ОтправляемоеСообщение = "Hello World!";
routingKey = ИмяОчереди;
Клиент.BasicPublish("", routingKey, ОтправляемоеСообщение, 0, Ложь);
Сообщить("Отправлено 'Hello World!'");

Перед выходом из программы нам нужно убедиться, что сетевые буферы были очищены и наше сообщение действительно было доставлено в RabbitMQ. Мы можем сделать это, аккуратно разорвав соединение.

// В компоненте отключение не предусмотрено, только присутствует правило
// Завершать работу с компонентой посредством обнуления объекта компоненты
Компонента = Неопределено;

Получение

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

Опять же, сначала нам нужно подключиться к серверу RabbitMQ. Код, отвечающий за подключение к Rabbit, тот же, что и ранее.

Следующим шагом, как и раньше, является проверка существования очереди. Создание очереди с помощью DeclareQueue является идемпотентным R10; мы можем запускать команду столько раз, сколько захотим, и будет создана только одна очередь.

ИмяОчереди = "hello";
КлиентКомпоненты.DeclareQueue(ИмяОчереди, Ложь, Ложь, Ложь, Ложь);

Вы можете спросить, зачем мы снова объявляем очередь R10; мы уже объявляли ее в нашем предыдущем коде. Мы могли бы избежать этого, если бы были уверены, что очередь уже существует. Например, если программа отправки была запущена ранее. Но мы пока не уверены, какую программу запускать первой. В таких случаях рекомендуется повторить объявление очереди в обеих программах.

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

В нашем случае эта функция выводит на экран содержимое сообщения.

Далее нам нужно сообщить RabbitMQ, что эта функция должна получать сообщения из нашей очереди приветствий:

noConfirm = Истина;
exclusive = Ложь;
Потребитель = Клиент.BasicConsume(ИмяОчереди, "", noConfirm, exclusive, 0);

Для успешного выполнения этой команды мы должны быть уверены, что очередь, на которую мы хотим подписаться, существует. К счастью, мы уверены в этом R10; мы создали очередь выше, используя DeclareQueue.

Параметр noConfirm(auto_ack) будет описан позже.

И, наконец, мы вводим цикл пока есть сообщения, который читает сообщение и выполняет вывод.

Пока Клиент.BasicConsumeMessage("", ОтветноеСообщение, ТегСообщения, 5000) Цикл
   Сообщить("Успешно! Из очереди прочитано сообщение " + ОтветноеСообщение);
   ОтветноеСообщение = ""; // Обнуляем, чтобы избежать утечку памяти
   ТегСообщения = 0; // Обнуляем, чтобы избежать утечку памяти
КонецЦикла;

По окончании цикла закрываем канал для чтения

Клиент.BasicCancel("");

Мы узнали, как отправлять и получать сообщения из именованной очереди. Пришло время перейти к части 2 и создать простую рабочую очередь (work queue).

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

P.S. Думаю будет полезно указать ссылки (пишите в комментариях, приведу в порядок) на

  • асинхронное подключение компоненты.
  • переиспользование компоненты (много времени уходит на её инициализацию)
  • зацикливание с collback на стороне сервера и клиента.

 

Ссылка на исходник обработки, приведу в порядок при написании всех частей

https://github.com/malikov-pro/1c-rabbit-tutorial

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

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование Конфигурации 1cv8 Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

15.11.2022    19644    18    SQV0    49    

37

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    24352    23    1    

25

Поиск данных Внешние источники данных Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Если вам нужно автоматически генерировать представления (view) к вашей базе данных 1С (есть две версии - для СУБД MS SQL Server и для PostgreSQL) по структуре метаданных 1С, то вам необходима данная обработка. Наш "Генератор View", другими словами - это коннектор к данным 1С для Power BI - незаменимый помощник для бизнес-аналитиков, работающих с базами 1С из Yandex Datalens/Power BI и т.д. Работает для обычных и управляемых форм под 1С 8.3

230000 руб.

31.07.2020    13502    13    48    

25

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    10449    11    8    

13

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

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

10200 руб.

24.06.2021    20344    57    53    

34

Внешние источники данных Загрузка и выгрузка в Excel Зарплата Бюджетный учет Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

48000 руб.

16.11.2018    30640    21    31    

22

Розничная торговля Внешние источники данных Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Бухгалтерский учет 1С:Бухгалтерия 3.0 Фармацевтика, аптеки Россия Бухгалтерский учет Платные (руб)

Внешняя обработка загрузки данных из файла-выгрузки, сформированного в программе F3 TAIL версии 3.4 (и выше) или еФарма версии 2.1, в базу конфигурации 1С: Бухгалтерия предприятия 8, ред. 3.0 (базовая, ПРОФ, КОРП, ФРЕШ).

13200 руб.

19.12.2016    46666    85    105    

65
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kotlovD 88 26.09.24 17:01 Сейчас в теме
pink rabbit не взлетела на нормальных нагрузках, были обнаружены потери посылок и очень сильно гадит она в файловую систему. Ушли от нее
d4rkmesa; Артано; +2 Ответить
2. malikov_pro 1329 26.09.24 17:06 Сейчас в теме
(1) На что перешли? Сам пробовал БИТ.Адаптер (в рамках обучения), на нагрузке в 30к элементов были потери пакетов. Не стал раскапывать, прогнал через 1С:Шина, полет нормальный.
3. kotlovD 88 26.09.24 17:22 Сейчас в теме
(2) На ИС нашел самую простую компоненту, вот с ней и работаем, в планах переход на 1С:Шину
4. пользователь 27.09.24 09:45
Сообщение было скрыто модератором.
...
6. Артано 786 27.09.24 13:16 Сейчас в теме
(2)
1. Можно сделать свою.
2. Можно пользоваться HTTP запросами, но разработчик не гарантирует доставку в этом случае. Хотя таким способом пользуются наверное почти все за пределами 1с
7. Артано 786 27.09.24 13:20 Сейчас в теме
(1) А как же бесячая реализация таймаута?!! ))
5. Артано 786 27.09.24 13:15 Сейчас в теме
Хотел зайти, чтобы написать, что пара методов на компоненте от Бита, это немного не то. Но ладно.
Но могли бы хоть рассказать, что кроме очередей, получателей и отправителей в раббите дофига сущностей и они важны
8. malikov_pro 1329 28.09.24 01:10 Сейчас в теме
(5) Всего 6 частей, вторую уже опубликовал, изначально цель была про RPC разобраться и написать, это 6 часть, по цепочке 1. и 2. сделал. Остальные по мере необходимости.
Оставьте свое сообщение