7 причин, почему интеграцию необходимо строить на очередях. Практика RabbitMQ. Отказ от Zato ESB и OData в 1С




Этот набросок является продолжение предыдущей статьи "7 причин, почему интеграция стала приятной. Не упускайте ряд потрясающих возможностей". В большей части это описание боли, через которую пришлось пройти на практике, используя сервисную шину данных Zato ESB и OData протокол совместно с «1С:Предприятие 8».

Ссылка на предыдущую статью: «7 причин, почему интеграция стала приятной. Не упускайте ряд потрясающих возможностей»

Практические минусы Open Data Protocol

В 1С Предприятие 8.3.5.1068 появилась поддержка автоматического REST-сервиса. Теперь платформа может автоматически формировать REST интерфейс для всего прикладного решения.

Это был глоток свежего воздуха, все данные как на ладони — бери и получай. Конечно, в скором времени появились простые и небольшие сервисы, и работали они стабильно, как часы. Соответственно гений инженерной мысли думает: вот она, «серебряная пуля». Что ж, в порыве эйфории один глобальный проект решено было выполнить, используя: Zato ESB (что же это?) и использовать REST интерфейс OData «1С:Предприятие 8» для обмена между двумя большими системами.

Проблемы, связанные с Open Data Protocol

Для реализации проекта на стороне Zato ESB была нанята команда программистов питонщиков. Основной задачей команды было брать данные из «1С:Предприятие 8» по протоколу OData, а также получать данные при помощи фоновых заданий «1С:Предприятие 8», которые, в свою очередь, передавали изменения данных, необходимых для сторонней системы. На этапе технического задания все выглядело прозрачно, но во время реализации возникли проблемы:

  • работа с большими таблицами (некоторые таблицы имели более 100 млн. записей). Получить срез данных было очень проблематично, что часто вызывало падение всех служб 1С;
  • получение данных в несколько потоков. Соединения, бывало, часто зависали, и лицензии заканчивались без видимой на то причины, спасал только рестарт службы «1С:Предприятие 8». Забавно было видеть несколько тысяч соединений, которые нельзя удалить;
  • танцы с бубнами и велосипедами, чтобы гарантировать доставку сообщений;
  • так как обмен работал в две стороны, возникла проблема в контроле логики и верности создания данных в «1С:Предприятие 8»;
  • изменение бизнес-процесса в одной системе приводило к необходимости внесения изменений в Zato ESB — в итоге получилась очень большая связность;
  • команда питонщиков, по сути, реализовывала буферные копии функционала 1С конфигурации — налицо дублирование кода;
  • ребятам питонщикам пришлось учить платформу «1С:Предприятие 8», чтобы понимать, как с этим работать;
  • ошибки в самом протоколе OData, что заставляло нас использовать только вышедшие обновления платформы «1С:Предприятие 8» с новой порцией ошибок, уже не связанных с OData.

Проблемы, связанные с Zato ESB

  • дорогие программисты, которым пришлось постигать азы платформы 1С;
  • ограничиваемся только одним языком программирования для выполнения обменов между системами;
  • в промышленных масштабах еще рано использовать, если, конечно, у вас много лишних серверов — можно попробовать на свой страх и риск;
  • иногда сервис падал без видимой причины, и докопаться до «почему?» не удалось.

Проект сейчас в режиме «заморожен» и чувствую, что вскоре будет полностью закрыт, в связи с техническими причинами, описанными выше.

 

7 причин, почему интеграцию необходимо строить на очередях

На данном этапе были переосмыслены все ошибки, было принято решение интеграцию строить на очередях, пока видны только одни плюсы, недостатки незаметны:

  1. используя очереди RabbitMQ, мы не ограничиваем себя одним языком программирования. Мы можем использовать, в большинстве случаев, родные языки систем, которые интегрируются, для отправки и приема сообщений;
  2. для гарантии доставки нам не нужно доставать бубны и велосипеды, если сообщение не может быть положено в очередь, то и транзакция будет безболезненно отменена;
  3. интеграция одной системы к многим и наоборот выполняется одной-единственной настройкой роутинга в RabbitMQ;
  4. простота формата сообщений, это бинарные данные — мы используем JSON, который переводится в бинарный формат;
  5. при высокой нагрузке, на довольно слабом виртуальном сервере, в очередь были доставлены все сообщения;
  6. каждый элемент системы не связан с другими элементами другой системы и бизнес-логика не дублируется, контроль целостности данных проверяется в едином месте в той системе, для которой эти данные предназначены;
  7. множество типов очередей, даже такие, что позволяют выполнять remote procedure call, но нужно стараться, чтобы системы были минимально связаны, бизнес-логика в «1С:Предприятие 8», а рабочие места, например, это мобильное приложение или веб-сайт.

Передача сообщения из  «1С:Предприятие 8» в RabbitMQ

Для реализации этого механизма было принято решение отказаться от веб-сервиса 1С в пользу NativeAPI компоненты, так как планируется передавать большие объемы данных. Весь инструментарий, который понадобится:

Исходный код, компоненты:

using System;
using System.Text;
using RabbitMQ.Client;

namespace _1CV8Publisher
{
public class V8Publisher
{
public string UserName { get; set; }
public string Password { get; set; }
public string HostName { get; set; }

public string Exchange { get; set; }
public string RoutingKey { get; set; }

public string SengMessage(string message)
{
try
{
var factory = new ConnectionFactory()
{
HostName = HostName,
UserName = UserName,
Password = Password
};
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: Exchange,
routingKey: RoutingKey,
basicProperties: null,
body: body);
}
}
}
catch (Exception e)
{
return e.ToString();
}

return "Data successfully delivered!";
}
}
}

С помощью NuGet console выполняем команду «install-package RabbitMQ.Client». В проекте должны появиться необходимые ссылки на RabbitMQ.Client. Компилируем, и компонента готова. Реализация общего модуля (все компоненты сохранены в конфигурации как бинарные макеты). На первом этапе загружаем внешнюю компоненту, далее возвращаем ее ссылку в метод, который вызвал инициализацию, на втором этапе, если компонента отличается от Неопределено, — вызываем функцию общего модуля ВыполнитьОтправкуВОчередь.

#Область ПрограммныйИнтерфейс

Функция ПолучитьОбъектКласса1CV8Publisher() Экспорт

ПодключитьВнешнююКомпоненту("ОбщийМакет.NETLoader", "NET", ТипВнешнейКомпоненты.Native);

Попытка
Компонента = Новый("AddIn.NET.NETLoader");
Исключение
ТекстСообщения = НСтр("ru = 'Ошибка при подключении компоненты ""AddIn.NET.NETLoader"": %ТекстСообщения%'");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ТекстСообщения%", ОписаниеОшибки());
ЗаписьЖурналаРегистрации("AddIn.NET.NETLoader",
УровеньЖурналаРегистрации.Ошибка,
,
,
ТекстСообщения,
);
Возврат Неопределено;
КонецПопытки;

КаталогКомпонент = КаталогВременныхФайлов() + Новый УникальныйИдентификатор;
СоздатьКаталог(КаталогКомпонент);
ПолучитьОбщийМакет("RabbitMQ").Записать(КаталогКомпонент + "RabbitMQ.Client.dll");
ПолучитьОбщийМакет("V8Publisher").Записать(КаталогКомпонент + "1CV8Publisher.dll");

Попытка
Компонента.CreateObject(КаталогКомпонент, "1CV8Publisher", "_1CV8Publisher.V8Publisher", , Истина);
Исключение
ТекстОшибки = Компонента.GetLastError();
Если ПустаяСтрока(ТекстОшибки) Тогда
ТекстОшибки = ОписаниеОшибки();
КонецЕсли;
ТекстСообщения = НСтр("ru = 'Ошибка при вызове метода ""CreateObject"": %ТекстОшибки%'");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ТекстОшибки%", ТекстОшибки);
ЗаписьЖурналаРегистрации("1CV8Publisher",
УровеньЖурналаРегистрации.Ошибка,
,
,
ТекстСообщения,
);
Возврат Неопределено;
КонецПопытки;

Компонента.HostName = "hostname";
Компонента.UserName = "admin";
Компонента.Password = "admin";
Возврат Компонента;
КонецФункции // ПолучитьОбъектКласса1CV8Publisher()

Функция ВыполнитьОтправкуДанныхВОчередь(Компонента, Exchange, RoutingKey, Message) Экспорт
Компонента.Exchange = Exchange;
Компонента.RoutingKey = RoutingKey;
Результат = Компонента.SengMessage(Message);
Если Результат <> "Data delivered successfully!" Тогда
ВызватьИсключение Результат;
КонецЕсли;
Возврат Результат;
КонецФункции // ВыполнитьОтправкуДанныхВОчередь()

#КонецОбласти

Теперь создадим очереди в RabbitMQ (связь систем 1 к 1, для связей 1 к 2 и больше необходимо создать дополнительные очереди, которые будут заполняться с помощью routing):

 Создадим exchanges, в которых укажем routing:

ВыполнитьОтправкуДанныхВОчередь(Компонента, "users", "users.event.create", Message);

Соответственно, после выполнения данной строки кода, в очередь users-create-queue упадут данные из параметра Message. Обратите внимание, нигде не указывается, в какую очередь отправляются данные, а указывается exchange и routing key. Для обмена с двумя системами просто нужно добавить новую очередь, которая предназначена для системы №2, и в exchange добавить тот же routing key, но указать очередь №2. Вот так осуществляется подписка на простые события.

 

Послесловие

Этот подход работает лучше, чем Zato ESB + OData. Время рассудит, станет ли это «серебряной пулей» или простой рабочей лошадкой для специфических задач интеграции.

Если вам помогла статья, благодарность можно выразить денежно.

Статья в личном блоге клац.

98 Comments

  1. pbazeliuk

    (1) kauksi, 100 млн. это цены номенклатуры, большинство других расчетов так же содержат сопоставимые объемы. Статья не предназначена для большинства аудитории, больше на развитие. Используя только 1С:Предприятие невозможно добиться необходимой гибкости, отказоустойчивости и ценности для конечного покупателя. Тренд все больше смещается на уменьшение задержек обменов с поставщиками, мобильными системами, а так же произвольным анализом данных в невероятных разрезах. Будущее, в этом плане, пока точно не за 1С:Предприятие, а за небольшими сервисами. У нас плавно идет смещение, что 1С:Предприятие это система где хранится первичная документация, например, подача документации в контролирующие органы идет с помощью других систем.

    Reply
  2. pahalovo

    А как можно подписаться из 1С на получение сообщений из очереди?

    Reply
  3. pbazeliuk

    (3) pahalovo,

    1С -> Очередь -> 1С. Реализовать прокси(http://infostart.ru/public/333924/) и 1С SOAPHTTP сервис на принимающей стороне.

    1С -> Очередь -> иная система. Воспользоваться примерами http://www.rabbitmq.com/getstarted.html

    Reply
  4. pbazeliuk

    (3) pahalovo, в принципе могу написать статью, как создать службу которая будет выполнять функции прокси-сервера. Правда на другом ресурсе, так как связь с тематикой 1С:Предприятие минимальная.

    Reply
  5. Tahallus

    (5) напиши, будет полезно

    Reply
  6. pahalovo

    (5) напиши, тема интересная. Как то искал готовое решение, которое бы забирало сообщение из очереди и пушило в веб-сервис. Пытался прикрутить для этой цели wso2. Сейчас понимаю, что написать свой адаптер будет проще и надежней.

    Reply
  7. FSerg

    Спасибо за статью! Очень позновательно.

    Reply
  8. pbazeliuk

    (8) Serginio, а как отловить события, если не существует соединений на кластере серверов 1С:Предприятия и не запущен ни один сеанс, только висит один единственный Apache?

    Reply
  9. Serginio

    (10) Я делал отдельный сервис и через него отправлял и полученные события отправлял на вэб сервис 1С.

    Отпрвавлял через пайпы

    Кстати многие используют для таких вещей Вэб сервисы. Просто они тяжеловаты по сравнению с NetNamedPipeBinding

    Reply
  10. Serginio

    Кстати не пробовал, но так как статические классы остаются после загрузки их можно использовать и в 1С сервисе.

    Можно держать регламентное задание которое будет запускать клиента Rabbit крутить вечный цикл и ждать события получать через AutoResetEvent через concurrentqueue

    Reply
  11. pbazeliuk

    (12) Serginio, с регламентными заданиями так же проблем достаточно, да и лицензия расходуется и обработка в один поток всего.

    Reply
  12. Serginio

    (13) C# потоков ты можешь использовать сколько угодно. Кстати откуда данные, что регламентные задания лицензии используют?

    Кстати здесь http://infostart.ru/public/466052/ есть пример запуска асинхронных запросов и ожидания выполнения.

    лист=Врап.СоздатьОбъект(«System.Collections.Generic.List`1[System.Threading.Tasks.Task]»);
    Для сч=1 по 10 Цикл
    Задача=Клиент.GetStringAsync(СокрЛП(сч));
    лист.Add(задача);
    КонецЦикла;
    
    Task=Врап.ПолучитьТип(«System.Threading.Tasks.Task»);
    
    
    массив=лист.ToArray();
    
    
    Task.WaitAll(массив);
    
    
    Для каждого задача из лист Цикл
    Сообщить(задача.Result);
    КонецЦикла
    
    
    

    Показать

    Reply
  13. pbazeliuk

    (14) Serginio, плюсом отметился, но с поддержкой замучаетесь, да и код понятен тому кто понимает в с# и 1С:Предприятие. Как по мне не зачем тащить внутренности c# в 1С:Предприятие, если мы теряем полезные фичи языка еще и сопровождаемость кода сильно усложняется.

    Reply
  14. Bronislav

    Ого, статья про мой любимый rabbitmq 🙂

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

    А уж чего стоит его плагин federation, который позволяет создать распределенную филиальную сеть и пробрасывать очередиexchange из центра в филиалы и наоборот.

    В работе кролик ведет себя крайне стабильно, за пару лет использования не могу вспомнить его падений.

    Reply
  15. Serginio

    (15) Спасибо. Я как раз эту разработку делал для использования Вэб сервисов неподдерживаемых 1С с кучей классов. Отдельно писать очень муторно. А здесь создал сборку, подключил ссылку на сервис скомпилировал и все впорядке. Кроме того сделал поддержку событий и жизнь стала еще легче. Кроме того никто не запрещает сделать свою сборку как у тебя, только использовать через Использование сборок .NET в 1С 7.x b 8.x. Создание внешних Компонент Просто в отличии от NETLoader можно использовать COM объекты. В данной разработке все .Net классы оборачиваются через Com объекты.

    И можно например использовать AutoResetEvent для сигнализации о получении сообщения итд. Больше возможностей.

    А зарегистрировать можно только на сервере и использовать любые нетовские сборки.

    Reply
  16. Bronislav

    Я правильно понимаю, что проект который заморозили на zato, в итоге запустили на rabbitmq?

    Можно подробнее развернуть про этот проект? Сколько систем участвовало в интеграции, кластеризовали ли кролика, использовали ли in-memory, плагин federation, shovel? Маршрутизацию настраивали руками через вебморду или использовали топики и ключи маршрутизации?

    Рад видеть, что кто-то еще использует rabbitmq 🙂

    Reply
  17. pbazeliuk

    (18) Bronislav, проект в замороженном состоянии, но уже практически его похоронили.

    Проект на RabbitMQ новый и перспективный, он похож на первый проект но с существенным отличием — система с которой будет происходить интеграция будет разработана под наши требования, а не взята в аренду (в которой изменить по сути было что-то невозможно). Это, можно сказать, проба пера первые практические результаты будут примерно в начале мая. Проект можно грубо назвать — облачная система продаж.

    По поводу настроек: и через веб-интерфейс и с помощью скриптов.

    Reply
  18. starik-2005

    (13) ну не совсем так. Можно и в 1С сколько угодно потоков запустить с помощью фоновых заданий. В принципе, тут статья про многопоточность, а тут про реализацию мьютексов, если они необходимы (а в таких системах вполне могут пригодиться)..

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

    Reply
  19. starik-2005

    ЗЫ: Ну и конечно Win Only позиционирование статьи меня радует мало, но за понимание того, что на 1С свет клином не сошелся, однозначный плюс.

    Reply
  20. pfihr

    Про линукс версию 1С для промышленной эксплуатации думать рановато (и под виндой то еще вагон проблем), так что .Net здесь очень в тему.

    Reply
  21. starik-2005

    (22) pfihr, а какие конкретно проблемы под Linux?

    Reply
  22. matytsin_new

    Делал подобное на MSMQ. Передавались сильно связные данные (более поздние сообщения не имеют смысла без более ранних). Возникла проблема, что делать серверу MQ если клиент не забирает данные из очереди. Очередь быстро растет, а очистить ее нельзя, поскольку 1с не сможет восстановить поток событий для очереди по требованию.

    Это хорошее решение, когда передаются данные, для которых важно только текущее значение (например баланс клиента). Если же важна история, все сразу становится сложнее.

    Reply
  23. minimajack

    (24) matytsin_new, зачем очищать очередь? Очередь на то и существует что бы получить все сообщения. Если очередь растет — проблема не в очереди, а в 1С которая не забирает данные.

    Reply
  24. Serginio

    Если, что то вот еще один вариант обмена данными http://infostart.ru/public/402038/

    Reply
  25. pbazeliuk

    (26) Serginio, тысяча чертей, лень читать и разбираться в простыне кода 🙂 хоть бы описание было: что? куда? и зачем?

    Reply
  26. pbazeliuk

    (26) Serginio, немного разобрался, но все равно не могу понять в чем преимущество? Да EF и LINQ клевая штука, но не сильно производительная (в книге Metaprogramming in .NET рассматривают этот вопрос).

    Reply
  27. Serginio

    Нормально там с производительностью, уж значительно быстрее чем через посредника. Смысл в том, что ты можешь тянуть данные напрямую, без посредника. Я помню сам из Штатов так прайсы миллионные скачивал, правда из MySQL. Но суть та же.

    Reply
  28. dddxddd

    ИМХО статья названа неправильно.

    Про пороблемы OData ровно одно предложение и то оно ниочем. Думаю правильней бы назвать «Как надо использовать -кролика- RabbitMQ» или «КролеГ работает лучше, чем Zato ESB + OData»

    Без обид, просто про проблемы реализации OData на платформе, о версии ее реализации как и о версии платформы в статье действительно нет ни слова.

    Reply
  29. minimajack

    (28) мне интересно как реализован слушатель…через регламентные задания?

    Reply
  30. Serginio

    (31) У ODATA http://infostart.ru/public/403524/ по сравнению с SQL огромное количество ограничений.

    Правда при использовании MS SQL настраивать MS SQL тоже нужно

    https://technet.microsoft.com/ru-ru/library/ms175483(v=sql.105).aspx

    Кроме того можно использовать HTTP и WEB сервисы

    (32) См. 17

    Reply
  31. pbazeliuk

    (32) minimajack, Win-служба пинает 1С HTTP-сервис, ждет пока 1С даст ответ что все отлично и сообщение можно удалять из очереди.

    Reply
  32. pbazeliuk

    (31) dddxddd, описал в статье проблемы OData которые были важны, в первую очередь, для нас. Да, возможно, не описал качественных показателей скорости получения данных из OData и Native компоненты. Разница в скорости примерно в 1000 раз. Так же OData не дает возможности получить больших массивов данных это при наших 192ГБ оперативной памяти и 40 ядрах процессора… службы 1с просто напросто падают.

    Reply
  33. lustin

    (0) круто !!!

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

    Я вставляю событие ПриДобавленииСтрокиЧекаПродажи() -> ОтправитьВОчередь(«retail.api.check.add.line», _GUIDТовара, _CodeТовара, _DescrТовара)

    В центре стоит подписчик которые рисует онлайн отчет с автообновлением под названием «Онлайн спрос на товар»

    Отчет выведен на большой экран и показывает текущий интерес к товару.

    Руководителям отделов продаж очень нравится.

    Таким вот решением достигается такое, что данные по событиям с кассовых мест получаются в центре не более чем через 15 секунд

    2 плагина необходимы для этого

    https://www.rabbitmq.com/shovel.html

    https://www.rabbitmq.com/federation.html

    (0) За ссылку на наше 8 часовое веселье спасибо. Применительно к ZatoESB я со сцены Инфостарта передавал вам привет, за наводку на неё. Передаю и тут 😉

    Reply
  34. Serginio
  35. kite2

    Первая причина это ты, а вторая все твои мечты… 🙂

    Reply
  36. Serginio

    (35) Кстати какой формат использовали? XML,JSON?

    Использовали ли при запросах gzip?

    Reply
  37. pbazeliuk

    (39) Serginio, формат сообщения JSON, который конвертируется в байты. Если понадобится сможем использовать Deflate.

    Reply
  38. Serginio

    (40) Я про ODATA какой формат использовали?

    Reply
  39. Serginio

    Кстати, а ProtoBuf не хотите использоват? https://habrahabr.ru/post/119503/

    Reply
  40. pbazeliuk

    (42) Serginio, зачем? данные не предназначены для систем, которые работают на .Net. .Net у нас прослойка для отправки сообщений в очередь из 1С и получении сообщений из очереди в 1С.

    (41) Serginio, частично XML, когда появилась поддержка JSON начали использовать его.

    Reply
  41. minimajack

    (42) Serginio, нахрена козе боян? протобуф из другой оперы …

    Reply
  42. Serginio

    (44) Из той. Он быстрее и компактнее, классы .Net тоже могут прослойкой.

    (43) И какова разница использования Odata с JSON и XML?

    Reply
  43. minimajack

    (45) Serginio,

    1. Лишняя прослойка

    2. Скорость будет медленнее нативной сериализации

    3. Нет готовых библиотек для 1С

    4. Нет сложных классов для передачи (только в таком кейсе протобуф выгоден)

    вывод: лишние костыли в инородной системе

    зы быстрее и компактнее не про 1С. Сэкономленные 5% трафика — смешно по сравнению с рисками и дополнительными косяками.

    ззы от пиара .Net уже тошнит ей богу — такое в ентерпрайс пустят только гики.

    Reply
  44. Serginio

    (46) Нет не будет. Можно использовать любые .Net библиотеки

    Использование сборок .NET в 1С 7.x b 8.x. Создание внешних Компонент

    Использование классов .Net в 1С для новичков

    Еще раз с помощью .Net классов можно решать любые задачи без использования ВК.

    Другое дело, что самым быстрым будет прямой доступ через SQL. Можно использовать ADO.

    Кстати данная разработка тоже построена на .Net. Тебя это почему то не коробит.

    Reply
  45. borda4ev

    По какой причине, не использовался продукт Axelot ESB? На текущий день, это коробочный продукт, непосредственно под эти цели, включил — работает; Из за того что он новый и появился недавно?

    Reply
  46. pbazeliuk

    (47) iTony73, информационный поток очень большой и за всем сложно уследить. Спасибо за ссылку, ознакомлюсь.

    Reply
  47. minimajack

    (48) Serginio, меня интересует не реализация — а подход.

    Использовать MQ — хорошо, OData — нормально(нет транзакционности из коробки), ADO — бред, EF — бред.

    зы имхо, объяснять почему что то хорошо, что то нет — не хочется; но кровавый энтерпрайз диктует свои требования.

    Reply
  48. Serginio

    (50) Вот и пришли, что нетовский клиент RabbitMQ это хорошо, а другой нетовский класс это плохо. Где логика?

    Про ADO расскажу такую исторю. Нужно мне было загружать миллионные прайсы в регистр сведений. Загружать через набор записей очень долго, так как удаляются все записи, а потом записывается опять полный набор. По одной записи обновлять, удаляь и добавлять тоже накладно. Но вот загрузить из текстового файла булками в темповую таблицу и использовать Merge для объединения данных решило проблему. Там где было десятки минут, стало пару минут. По твоему это бред. По мнению моей конторы это огромное облегчение труда и удобства для клиентов.

    Reply
  49. minimajack

    (51) Serginio, MQ — message queue — по русски очередь сообщений. Использовать очереди это хорошо, то что используется .Net — мне не нравится.

    Нужно мне было загружать миллионные прайсы в регистр сведений

    — ну что тут сказать…тут вариантов тьма. Важен кейс использования этих данных — по видимому проблема в архитектуре приложения.

    Reply
  50. Serginio

    (52) minimajack,

    Проблема в том, что еще клиенты просят прайсы с наилучшими ценами. А количество позиций по десякам прайсов было по 100 миллионов. Там еще использовалась конструкция WITH TIES для отбора по цене и остаткам на складе. Все делалось для клиентов. Но это было быстро и удобно. При этом работали и вэб сервисы, как к нам так и от нас.

    В чем проблемы в архитектуре?

    Reply
  51. minimajack

    (53) Serginio, надеяться на 1С8 загружая стомиллионные прайсы и ожидая отклик в несколько минут

    Reply
  52. Serginio

    (54) minimajack, нет проблем до сих пор. Так, как запись все в обход 1С. А вот что касается поиска и прочее 1С прекрасно работает уже лет 7. Что я делаю не так? Кстати про WITH TIES

    http://www.forum.mista.ru/topic.php?id=751931&page=2#163

    Reply
  53. Evil Beaver

    (0) из статьи не уловил — куда ушел OData из связки с 1С? 1С каким механизмом вызывается со стороны очереди? Или она только кладет что-то в Rabbit и извне не вызывается?

    Reply
  54. minimajack

    (56) Evil Beaver,

    Win-служба пинает 1С HTTP-сервис, ждет пока 1С даст ответ что все отлично и сообщение можно удалять из очереди.

    костыль в общем)

    Reply
  55. AKulakoff

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

    Не рассматривали IBM WebSphere MQ, правда стоимость его не совсем привлекательная.

    Reply
  56. pbazeliuk

    (58) AKulakoff, добрый день, выбрали потому, что стоимость и порог входа минимальный, а так же делаем точки соприкосновений различных языков (php, python, c#, 1C, JavaScript). Это дает возможность использовать другие технологии, с которыми в 1С есть проблемы, например: гарантия доставки сообщений, dash boards, мобильные приложения, версионирование объектов, для поиска — ElasticSearch и т. п.

    В трансформации пакета, не вижу надобности. Все данные ходят в формате JSON, в случае если другой системе понадобятся данные она подпишется на необходимый обмен со своей анонимной очередью.

    Reply
  57. pbazeliuk

    (58) AKulakoff, отличная скорость доставки сообщения из 1С:Предприятие (с помощью Native компоненты) в RabbitMQ занимает это дело около 5-7 мс. В принципе можно посмотреть на пульс обмена и понять, когда происходят пики нагрузки.

    Reply
  58. pbazeliuk
  59. pbazeliuk

    (18) Bronislav, вот как-то так выглядит схема использования у нас

    Reply
  60. Bronislav

    (62) pbazeliuk

    Отлично 🙂

    Exchange с типом топик используете?

    Насколько понял из схемы, 1С ничего не знает о мобильных и веб приложениях и они как постоянные подписчики работают?

    Reply
  61. pbazeliuk

    (63) Bronislav, не постоянные, если кто-то подписывается он создает свою анонимную очередь и добавляет bind в exchange (какие именно события отлавливать), при отписке очередь автоматически уничтожается. По похожем принципу работает RPC. Да exchange с типом topic.

    В итоге руками только созданы 3 объекта — rpc queue, exchange queue и log queue, все остальное динамическое.

    Reply
  62. Evil Beaver

    (62) а чем такую чудесную диаграмму рисовали?

    Reply
  63. pbazeliuk

    (65) Evil Beaver, да у меня жена профессиональный дизайнер, в декрете скучно ей, подрисовывает (Adobe illustrator) 🙂

    Reply
  64. AKulakoff

    (59) Трансформация обычно нужна, когда один объект летит в несколько баз и для каждой базы требуется свой пакет.

    Так было в моем случае, но решение было на IBM WebSphere MQ, правда порог входа в нее совсем не бюджетный …

    А есть статистика сколько пакетов проходит за определенный период (час, день)

    Reply
  65. pbazeliuk

    (67) AKulakoff, около 10 тыс. сообщений в час, но это пока тестовый режим. Дальше будет видно.

    Reply
  66. lustin

    (58) AKulakoff, ВебСфера очень дорого… прям запредельно… в том числе по стоимости владения, а не только по лицензиям. Как и другие платформы интеграции за авторством Java программистов.

    лучшей реализации AMQP кроме RabbitMQ для production сейчас не найти.

    Reply
  67. lustin

    (68) кстати насчет Zato + OData. Я как то говорил, что проблема не в этой связке как таковой — Zato удобная для понимания концепции ESB. Но Zato заточено под EDA — https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B9%D0%BD%D0­%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2­%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D1%85%D0%B8%D1%8­2%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0

    C точки зрения EDA OData протокол реализациия в 1С слишком избыточна — 1С-ные объекты «большие». Поэтому ZatoESB у нас на методических проектах используется только как сервис создания API и сервис интеграции одного API в другое.

    Reply
  68. minimajack

    (69) lustin, эээээээ!! А как же http://activemq.apache.org/ ?

    добавляем везде слово ИМХО

    для интеграции с 1С практически все равно какая MQ…1С просто не загрузит шину ИМХО =))

    Reply
  69. lustin
    Reply
  70. lustin

    (0) еще раз пересмотрел название очередей. Пётр — вопрос, а вы серьёзно подходили к разработке routing topologies ? Если в статье указан пример — то ладно, а если реальные наименование, то они «слишком абстрактные».

    Reply
  71. pbazeliuk

    (73) lustin, на самом деле все по другому.

    Вот это реальная схема получения информации из 1С

    Оповещения о других событиях 1С идут в Exchange (1c.events), по определенным routing keys. На оповещения подписываются анонимные очереди.

    Схема работы примерно такая: запускается сторонний сервис, получает полную информацию по схеме RPC, паралельно создает анонимную очередь и подписывается на определенные события (1c.events). Когда сервис отключается, анонимная очередь уничтожается. Пакеты о событиях нумеруются, что бы сервис понимал что произошел сбой сети и снова получил полную информацию по RPC.

    Reply
  72. Makushimo

    Круто. но нифига не понятно.

    гугел, я к тебе -))

    Reply
  73. pbazeliuk

    (72) lustin,

    Мы в нашей команде уже использовали много шин и очередей. https://bitbucket.org/alexey_yakimovich/

    Просмотрел этот проект, на сколько понимаю, проба пера? Потому, что для больших нагрузок (несколько тысяч сообщений в секунду) и больших трансферов (больше 500MB) не предназначен. Хотел спросить может есть у вас Native компонента для 1С для отправки? У себя пока используем hosting CLR, но по производительности при высокой частоте сообщений появляются проблемы.

    Reply
  74. Serginio

    Тебе стоит посмотреть в сторону асинхронного выполнения методов

    Reply
  75. pbazeliuk

    (77) Serginio, сервис, для RPC, работает асинхронно, с ним все отлично. Проблема больше в компоненте 1С которая передает данные, проблема не в размере передачи данных, а в частоте их передачи.

    Reply
  76. Serginio

    (78) Я говорю про асинхронную передачу из 1С

    .Net в 1С. Асинхронные HTTP запросы, отправка Post нескольких файлов multipart/form-data, сжатие трафика с использованием gzip, deflate, удобный парсинг сайтов и т.д.

    Там есть пример

     Выполнитель=Врап.ПолучитьАсинхронныйВыполнитель();
    ДобавитьОбработчик Выполнитель.ПриОкончанииВыполненияЗадачи, ПриОкончанииВыполнения;
    
    ВыполненоЗадач=0;
    МассивОтветов=новый массив;
    
    stopWatch = Врап.СоздатьОбъект(«System.Diagnostics.Stopwatch»);
    stopWatch.Start();
    Для сч=1 По 100 Цикл
    // Получили задачу, которая выполняется в другом потоке
    // Обычно запрос отправляется быстро, а результат получает по событию.
    // При этом потоки не простаивают для ожидания результата
    Задача=Клиент.GetStringAsync(СокрЛП(сч));
    // если нужен результат то дожидаемся
    // и вызываем ПриОкончанииВыполнения
    Выполнитель.Выполнить(задача,ТекущаяДата());
    
    
    КонецЦикла;
    
    КонецПроцедуры
    

    Показать

    И сама процедура

    Процедура ПриОкончанииВыполнения(Задача,ДанныеКЗадаче)
    
    // Обязательно нужно отлавливать ошибку в 1С
    // Иначе она передается в .Net где обрабатывается там
    Попытка
    Так как задача может завершиться с ошибкой
    Мы должны проверить, и если ошибка нужно предпринять какие то действия
    Если (Задача.IsFaulted) Тогда  // Ошибка выполнения
    
    Сообщить(«Ошибка «+Врап.ВСтроку(Задача.Exception));
    Сообщить(«Данные к задаче «+Врап.ВСтроку(ДанныеКЗадаче));
    
    иначе
    Сообщить(«=====Выполнена задача ====»);
    Сообщить(«Данные к задаче «+Врап.ВСтроку(ДанныеКЗадаче));
    Сообщить(Врап.ВСтроку(Задача.Result));
    
    
    КонецЕсли;
    
    Исключение
    Сообщить(«Ошибка в процедуре»);
    Сообщить(ОписаниеОшибки());
    КонецПопытки
    
    КонецПроцедуры

    Показать

    Reply
  77. Serginio

    Наверняка у RabbitMQ.Client есть асинхронные методы

    Reply
  78. pbazeliuk

    (79) Serginio, при использовании HTTP больших размеров падает RabbitMQ. Для больших данных только TCP.

    Reply
  79. pbazeliuk

    (80) Serginio, https://github.com/rabbitmq/rabbitmq-dotnet-client/issues/83. Нет реализации еще.

    Reply
  80. Serginio

    Ну можно и самому вызов в Task завернуть. Главное, что бы 1С не ждала результата. Странно, что RabbitMQ.Client не используют. Асинхронные методы уже стандарт в .Net

    Reply
  81. Serginio

    Второй вариант это 1С кладет данные в очередь, а уже отправкой занимается класс на C#. Скорость вызова на моей кроссплатформенной компоненте порядка 40 000 вызовов в секунду.

    Reply
  82. Serginio

    Но проще запускать Task.Run а внутри планировщик сам создаст очередь

    Reply
  83. Mambetin

    Ну вот почему то про очереди все славно поговорили…. а про трансформацию ни слова.

    А это самый геморрой.

    Reply
  84. pumbaE

    (86) Mambetin, а что есть какая-то волшебная таблетка от геморроя при трансформации? Как не крути, а трансформация всегда будет геморроем и тут без разницы — будет это в 1с, в какой-нибудь esb шине или еще где-то.

    Reply
  85. Mambetin

    (87) pumbaE, так вот и интересно кто в каком месте подорожник прикладывает. в 1С или в очередях колдуют

    Reply
  86. pbazeliuk

    (88) Mambetin, на стороне 1С конвертируешь объект в json (можно даже сделать универсальный конвертор), а далее те кому он нужен (внешние системы) пусть с ним и разбираются.

    Reply
  87. Mambetin

    (89) в каноническую универсальную структуру объекта ?

    Reply
  88. lustin

    (76) ох ты… а я пропустил это сообщение

    На bitbucket — проект просто обучающий, в рамках понимания тех кто только начинает.

    есть такое https://xdd.silverbulleters.org/t/nemnogo-novostej-pro-integracziyu/505/1 — если про NativeAPI, там BDD, CMake и кроссплатформенность. Сейчас в пилотировании.

    собственно это то что мы активно делаем сейчас уже как 3 месяца… Еще и mqtt протокол.

    Reply
  89. pbazeliuk

    (92) lustin, было бы интересно почитать про возможности и концепцию работы в понимании вашей команды.

    Со своей стороны, планирую в недалеком времени первичные наработки выложить (те, что вот, от которых будем отказываться в пользу более мощных и универсальных подходов).

    Если быть более точным, то вот это: Hosting CLR + Win сервис, ну и базовый код к нему. Это бесплатно, не сильно удобно и с некоторой стороны тяжело в разработке. Так же расписать некоторые нюансы работы с кроликом.

    А вот следующий за ним конструктор, библиотека Native API, а так же библиотеки проверки «1С объектов» платно и дорого. Как говорится не только ж события слать, а и создавать эти же «1С объекты».

    Reply
  90. pbazeliuk

    (94) Serginio, от .NET полностью не собираюсь отказываться. По сути уже целый год прорабатываю различные схемы интеграции и построение сложных систем. Понимаешь есть понятия, как паттерны проектирования, расширения объектов, разграничения ответственности, DI и т. п.

    Мне, вот чесно, сложно представить как поддерживать такой код как у тебя, подход возможно стоит внимания, но в плане сопровождаемости он ужасен. Кроссплатформенность под вопросом (под .NET Core нет еще много библиотек, того же SignalR), а поднимать разные слои для взаимодействия простых объектов — лишние затраты программистов и администраторов. Может конечно для небольших внедрений он идеален, но моя цель большие предприятия с большим зоопарком систем и гигантской нагрузкой онлайн.

    Reply
  91. Serginio

    (95) SignalR выйдет в 4 кватале либо в первом 2017

    https://blogs.msdn.microsoft.com/dotnet/2016/07/15/net-core-roadmap/

    https://github.com/aspnet/Home/wiki/Roadmap

    Что касается Hosting CLR + Win сервис то он значительно менее функционален по сравнению с новый COMОбъект(«NetObjectToIDispatch45»);

    Так как поддерживается почти все классы .Net, а внутри используют те же механизмы COM.

    Единственно, что нужно регистрировать одну библиотеку. Но все остальные сборки вызываются без регистрации.

    Другое дело, что зная ClassID можно создавать IDispatch и без регистрации

    Для .Net Core на днях выложу аналог .NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия

    А вот, что касается Native API то нужно как то влиять на 1С, что бы они расширили возможности ВК.

    Так они наконец дали возможность передавать в параметрах ДвоичныеДанные. Только все это медленно

    Reply
  92. b00t

    (22) pfihr, а потом, когда linux будет в тему, что делать с тоннами legacy-кода? Кросплатформенность — это такая штука, о которой правильно думать сразу, а отложенная на потом — она будет отложена навсегда или ляжет тяжким грузом на того, кто будет сопровождать систему после «горе-разработчика» напихавшего в неё COM/ActiveX/.NET

    .NET может быть с очень большим натягом кросплатформенным, но на средних и больших проектах, особенно в связке с 1С — это будет стоить огромных усилий.

    Reply
  93. dm2010

    (72) lustin, Ищу решение для задачи: обмен сообщениями между приложениями на разных платформах, с возможностью подключения новых неизвестных приложений. Сообщения — это набор электронных документов и операций по конкретным бизнес процессам между компанией и ее клиентами, формат сообщений свой. У сообщений будет единый согласнованный формат, но приложения могут оправлять сообщения как в согласованном формате, либо в своем формате который затем будет конвертироваться. Нужна поддержка синхронного и асинхронного обмена с гарантированной доставкой.

    Как я понял, ESB и Шина сообщений решают эти задачи. Остановился на Zato ESB, т..к. она бесплатная, поддерживает создание сервисов, конвертацию сообщений, разработку своих адаптеров.

    Товарищи, наставьте на путь правильный: или скажите где дальше копать.

    1) Имеет ли Zato в своем составе Шину сообщений, поддерживает ли она гарантированную доставку и асинхронный обмен сообщениями?

    2) Исходя из описания на сайте Zato и комментарий Алексея Лустина, где он пишет про использование Zato ESB + RabbitMQ, предположу что Zato не поддерживает эти функции, поэтому используется в связке с Rabbit, потому что он это поддерживает ?

    3) Второй момент, тут в комментариях упоминалось что Zato больше подходит под решение задач где применимы модели EDA и SOA. Под эти модели хорошо попадают задачи выполнения операций (исполнение бизнес-процессов, транзакций и пр.), а для просто надежного обмена сообщениями (например обмен между базами 1С) подходит просто Шина сообщений (RabbitMQ). Предположу что для моей задачи применима модель SOA с созданием сервисов в Zato.?

    Буду рад позже поделиться своим опытом. Всем спасибо!)

    Reply
  94. pbazeliuk

    (109) dm2010, Zato имел свою проблему, что он падал без причины. Разработчик через год устранил проблему, но не понятен цикл и будущее развитие Zato как сервиса.

    Zato имеет поддержку RabbitMQ;

    Возможно, как и EDA так и SOA. Но если использовать одну из моделей тогда придется пожертвовать чем-то, например: асинхронностью или гарантией доставки или транзакционностью. SOA это сильное связывание приложений, EDA слабое.

    Если уже есть техническое задание, смогу подсказать что можете использовать.

    Reply
  95. dm2010

    (110) Спасибо. Техническое задание готовлю, как можно с Вами связаться?

    Reply

Leave a Comment

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