Паттерн Pub/Sub для самых маленьких

Разбираем паттерн "на пальцах"

При обмене данными между разными информационными системами мы сталкиваемся с определенными трудностями:

  1. Как отправить сообщение из одной информационной системы нескольким, не зная об их количестве.
  2. Как нам отправлять сообщения, не дожидаясь ответа.
  3. Как отправить одно и то же сообщение информационным системам, требующим на вход разные типы сообщений (xml, json и т.д.).

Паттерн Publisher/Subscriber, также известный как Observer, позволяет сделать возможным такое взаимодействие, добавляя прослойку между отправителем и получателем в виде сервера. Благодаря серверу мы можем подняться на один уровень абстракций выше обмена и добавить сущность для промежуточного хранения файлов, а также сущность для преобразования файлов.

Реализуем данный паттерн текстом.

Без шины (принцип вытягивания).

Жил-был магазин животных, в него приходили покупатели и покупали домашних животных. Но в один момент магазин стал слишком большим для просто закупок, и они стали продавать животных через биржу магазинам поменьше. Но они столкнулись с проблемой, некоторые магазины брали только кошек, некоторые только собак, некоторые только собак комнатного размера.

С простейшей шиной (толкай — тяни)

Тогда магазин (pub) нанял мужичка (server), которому они отдавали животных по мере появления. Мужичок бережливо распределял их по разным комнатам, кошек в одну, собак в другую. А магазины (sub) поменьше стали приходить только в нужные им комнаты и брать живность. Но покупателей становилось всё больше, и сами они становились всё специфичнее. Одни требовали сделать прическу собакам, другие научить их командам, а третьи расстраивались, когда, придя в комнату, не находили там животных, из-за того, что их уже кто-то забрал.

С полноценной шиной.

Тогда хитрый мужичок построил аппарат для клонирования, и каждому приходящему в комнату отдавал нужное животное (message), но с необходимым набором навыков (xml, json, char[]… whatever).

Домашнее задание.

  1. Реализовать вариант «с простейшей шиной» на языке 1С. 1 pub, 2 subа.  В качестве хранилища использовать каталоги системы. Обмен в формате xml, через стандартную сериализацию. Порядок обмена следующий:

         1.1   Pub кладет в каталог pub файлик со строкой.

         1.2   Шина его забирает.

         1.3   Преобразует файл ( input: MessageNumber.xml, output: base1_ MessageNumber.xml, base2_ MessageNumber.xml).

         1.4   Кладет полученные файлы в каталог sub.

         1.5   Удаляет файл из каталога pub.

         1.6   Откуда их забирают (слушая наличие файлов) subы, записывают значения в справочник. И удаляют файлик.

      2. Усложним задачу: одна из баз будет принимать xml, а вторая json. Сведения о том, какая база какой тип принимает,                     должны храниться в шине в виде справочника.

          Как проверяется задание:

В Publishere пишем строку, нажимаем “Разослать», проверяем наличие записи в базах-приемниках.

39 Comments

  1. CheBurator

    ничего непонятно.

    не понял, почему в домашнем задании нельзя

    1.1 Pub кладет в каталог sub

    ???

    Reply
  2. premierex

    (1) CheBurator, потому что шина в данном примере выступает координатором транспорта сообщений и является, по сути, независимой системой.

    (0) Интересный пример.

    Reply
  3. CheBurator

    (2) Ничего не понял*2

    для чего необходио вводить промежуточную систему.

    почему Pub не может сразу положить в Sub

    Шина, являясь промежуточным звеном, является в свою очередь ОТПРАВИТЕЛЕМ.

    Почему исходному отправителю присущи недостатки/проблемы (описано в постановке задачи в сабже), а шине — которая тоже отправитель — внезапно такие недостатки/проблемы не присущи?

    Reply
  4. Armando

    Какой-то sap pi/xi

    Reply
  5. FilatovRA

    (4) Armando, всё верно и IBM ESB и Microsoft Biztalk всё о том же 🙂

    Reply
  6. FilatovRA

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

    Reply
  7. CheBurator

    (6) Специализация системы понятна.

    остался вопрос:

    Шина, являясь промежуточным звеном, является в свою очередь ОТПРАВИТЕЛЕМ.

    Почему исходному отправителю присущи недостатки/проблемы (описано в постановке задачи в сабже), а шине — которая тоже отправитель — внезапно такие недостатки/проблемы не присущи?

    Reply
  8. minimajack

    (7) CheBurator, потому что шина обычно одна, а отправителей-получателей может быть много….

    Reply
  9. CheBurator

    (8) ответ вообще ни о чем

    Исходный отправитель на строне отправителя тоже один

    Шина как отправитель — тоже одна

    При этом исходному отправителю присущи некоторые проблемы

    А шине- отправителю эти проблемы внезапно не присущи

    Непонятно

    ВОПРОС ОСТАЛСЯ

    Reply
  10. CheBurator

    Попутный вопрос чайниколамера

    В чем цимес внедрения еще одного звена в путь передачи данных — то есть усложнения пути — добавления добавочных стыков с соответствующим увеличением риска повреждения стыков?

    Reply
  11. FilatovRA

    (3) CheBurator, перечитал пост, о какой именно проблеме присущей отправителю, описанной в тексте, идет речь?

    Reply
  12. premierex

    (9) CheBurator, прочитайте вот эту статью, может быть что-то для себя проясните. ESB — довольно распространенный стандарт обмена данными между различными информационными системами.

    А пример приведён «для самых маленьких», т. е. простейший пример использования шины для обмена сообщениями (что и указано в заголовке публикации).

    Reply
  13. Armando

    (10) CheBurator, информационных систем может быть туева хуча и все они должны между собой обмениваться, при этом они все могут находиться в разных зонах безопасности. Каждая инф система поддерживает ограниченное количество технологий обмена данными, и имеет свои особенности работы с этими технологиями. Задача источника гарантированно передать на шину пакет данных в своем формате. Задача шины преобразовать входящие данные в формат понятный получателю и обеспечить гарантированную доставку. То есть источника не волнуют особенности целевого получателя, которых много. Это головная боль шины, которая одна и всё умеет. Если шины не будет, то на стороне источников придется учитывать особенности всех получателей и обеспечивать доступ к ним. Если тебе эти проблемы не знакомы, то шина не нужна.

    Reply
  14. FilatovRA

    (10) CheBurator, шина в данной статье использована лишь для демонстрации паттерна, но если цглубиться в тему, то с помощью шины мы можем обеспечить асинхронность обмена, например: есть СверхсекретнаяСистемаКакого-тоНИИСверхзакрытаяИз-заСтарыхНачальников-маразматиковИТакПовелосьИНеСокращатьЖеПервыйОтделУМеняТамТещ­аРаботает, написана индусами на коболе и может отдавать важную цифру файликом только 1 числа каждого месяца и обязательно требует подтверждение доставки, иначе новый не даст. И есть вторая система НеМенееСекретногоНИИКотороеНаходитсяВЮрисдикцииТогоЖеВедомст­ваНоОтЭтогоКакОбычноНеЛегче, которая может принимать этот файлик только по средам при прлной луне, причем во вторник файлика быть не должно ни в коем случае, иначе система встанет. Вот тут на помощь и приходит шина 😊

    Reply
  15. CheBurator

    (13) Спасибо за внятный ответ. По сути: проблем при обмене много. Это не значит в общем случае что эти проблемы нельзя решить на стороне отправителя. Но вопросы взаимодействия отправителя и получателя являются специфическими и их ПРОСТО УДОБНЕЕ ВЫДЕЛЯТЬ В ОТДЕЛЬНУЮ НЕЗАВИСИМУЮ СПЕЦИАЛИЗИРОВАННУЮ СИСТЕМУ(ШИНУ) ОБМЕНА.

    Все. Вот так я понял те «сопли», которые были развешаны в публикации (спасибо комментам).

    Reply
  16. CheBurator

    Но, получается, шину все равно не сделать достаточно независимой.

    например, отправитель умеет отдавать в xml

    получатель читает только csv

    вопрос: на основании чего шина преобразует одно в другое? человек, работающий на шине — идет к отправителю, выспрашивает, идет к получателю, выспрашивает, думает, пишет коннектор-преобразователь. если это все в рамках одного предприятия/холдинга — концы еще можно склеить. Если отправители и получатели — разные конторы — превращается — даже на простых вещах — в приличную (_._) — так и живем (zркий пример — EDI)

    Reply
  17. TODD22

    (16) CheBurator,

    Но, получается, шину все равно не сделать достаточно независимой.

    например, отправитель умеет отдавать в xml

    получатель читает только csv

    Шина это же не только преобразование. Это ещё разные функции отвечающие за доставку сообщений и тд. Например этот функционал у нас для всей системы одинаковый.

    Ну а преобразование это только часть функционала. Его уже по принципу подключаемых модулей можно модифицировать.

    Reply
  18. premierex

    (16) CheBurator, Вы, очевидно, не видите разницу понятий: централизация и децентрализация. Шина позволяет централизировать данные, отправляемые и принимаемые разными информационными системами. Поэтому схема: pub-sub не является централизованной (читайте текст публикации), а схема pub-esb-sub как раз и будет схемой централизации. В общем, для каждого предприятия схема обмена сообщениями специфична. Где-то необходима централизация (как раз с использованием шины), а где-то — нет. Форматы сообщений не имеют ни какого значения. Главное — чтобы система, которая является координирующей в обмене (шина), могла их трансформировать в форматы сообщений принимающих систем.

    Reply
  19. bayce

    А будет ли все это быстро работать на 1С?

    Reply
  20. CheBurator

    (18) спсб за пояснения.

    вопрос: какая система является более устойчивой — централизованная или децентрализованная?

    Reply
  21. premierex

    (20) CheBurator, всё зависит от предприятия, в котором та или другая система будут работать. Для крупного холдинга, я думаю, централизованная система достаточно важна, поскольку данные распределены по многим информационным системам. Для небольших организаций (опять же моё мнение) централизация не так необходима.

    Reply
  22. premierex

    (20) CheBurator, да, насчет устойчивости этих систем… В схеме pub-sub, конечно же, меньше «телодвижений», но она не настолько универсальна как другая. В общем: под каждое предприятие следует подбирать определённую схему обмена сообщениями.

    Reply
  23. CheBurator

    (22) угу

    Я тут как раз об этом подумываю, бо вопросы коннектов с другими системами начинают задалбывать

    На портале даже почти нужное нашел — сборщика файлов с фтп, мыла и прочего

    Полезная вещь Инфостарт

    Reply
  24. premierex

    (23) CheBurator, не была бы полезной мы сюда и не заходили бы. Здесь многие делятся своим опытом. Кто-то платно, кто-то за «фишки», но портал, несомненно, ценен. Спасибо, Доржи!

    Reply
  25. minimajack

    (9) CheBurator,

    pub -> sub1
    pub1 -> sub1
    pub2 -> sub2
    pub3 -> sub2
    

    заменяется на

    pub -> esb
    pub1 -> esb
    pub2 -> esb
    pub3 -> esb
    
    esb -> sub1
    esb -> sub2

    при этом получаем:

    • гарантированную доставку(опционально)
    • независимость от количества издателей и слушателей
    • одно место контроля
    • одно место резервирования

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

    на примере выше было 8 различных вариантов получения данных, после «внедрения шины» осталось 6

    Reply
  26. CheBurator

    (25) спсб за пояснения

    Reply
  27. premierex

    (26) CheBurator, в (18), мои пояснения были не совсем правильными, точнее, совсем неправильными (странно, что этого никто не заметил). Схема с шиной является, наоборот, схемой децентрализации, т.к. сама она данные не хранит, а всего лишь принимает и передает получателям. Схема централизации же собирает, хранит, обрабатывает и передает данные, полученные из одних иформационных систем другим. Решать, какая схема стабильнее, можно только исходя от специфики и архитектуры информационной системы в целом. Когда паблишер один и получателей немного, вполне подойдёт централизованная схема, а вот, когда паблицеров и получателей становится много — без децентрализации, мне кажется будет не просто обойтись.

    Reply
  28. minimajack

    (27) premier, да выкиньте понятие «[де]централизация».

    Шина она и в Африке шина. Она принимает и передает(опционально с хранением, транзакцией)!

    в вашем понятии:

    децентрализация:

    отправитель -> шина -> получаетель

    централизация:

    отправитель -> мегасуперпупершина (хранит, обрабатывает, галстучки вяжет) -> получатель

    по сути является:

    отправитель -> шина -> обработчик данных -> шина -> получатель

    То есть, шина остается все та же, но в каналы встраиваются обработчики которые инфу обрабатывает и возвращают обратно в шину. Грубо говоря, растягивается цепочка доставки. Опять же профит…например конвертация xml->json (html->pdf) универсальная, и достаточно встроить обработчик в шину чем на каждом отправителе(получателе) вызывать отдельно. Опять же одно место контроля за правильностью(работой) кода.

    теперь про хранение.

    Шина всегда хранит сообщение — ей же нужно как то его передать.

    Если выключается свет что делать с сообщениями?

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

    Когда же транзакционность не нужна? Например состояния каких либо датчиков, данных устаревающих которые не имеет смысл хранить дольше определенного срока. В общем все что не персистентно — работает без транзакций и реально быстрее и легче в интеграции.

    Reply
  29. premierex

    (28) minimajack,

    в вашем понятии:

    децентрализация:

    отправитель -> шина -> получаетель

    централизация:

    отправитель -> мегасуперпупершина (хранит, обрабатывает, галстучки вяжет) -> получатель



    В моём понятии централизация -это когда шина всегда хранит принятые данные и сама же эти данные раздает, если требуется.

    Во втором варианте шине требуется хранить данные только до момента подтверждения приема-доставки сообщения.

    Вот, по-моему, и вся разница в этих понятиях.

    Reply
  30. FilatovRA

    (28) minimajack, вот по поводу хранения в шине не могу с вами согласиться. В простейшей шине не хранится ничего. Пример схемы: шина мониторит каталог, при появлении файла копирует его в 2 других каталога. У шины лишь 2 интерфейса, откуда брать и куда ложить и одно состояние, получилось/не получилось.

    Reply
  31. FilatovRA

    (29) premier, в моем понимании шина в обмене данными может быть только инструментом централизации, т.е. схемы, при которой при потере одного элемента теряется вся цепочка: многабаз ⤑ шина ⤑ многадругихбаз.

    Reply
  32. FilatovRA

    (30) поправка, не ничего, а не хранятся сообщения.

    Reply
  33. minimajack

    (32) а давайте наоборот!

    Откуда шина знает про каталоги? Что значит интерфейс — это то что принадлежит шине или что то стороннее? Если шина потеряет доступ к каталогу — что сломалось, шина или внешняя система? Кто должен сообщить что проблемы, шина которая не может обратиться к каталогу или внешняя система?

    И тут возникает вопрос: «Являются ли каталоги частью шины?».

    Если нет, тогда почему шина о них знает?

    Если да, то каталоги и являются местом хранения информации в шине.

    Ответьте для себя на вопросы и тогда все станет ясно.

    шина в обмене данными может быть только инструментом централизации

    — тут с вами полностью согласен, шина именно что централизует поток сообщений.

    Reply
  34. CheBurator

    (27) я обратил внимание на эту «фишку», но раз спец написал — значит написал ;-), хотя навскидку как-то не склеилось, а как понимать централизация/децентрализация — ну хз.. я подумал что шина есть централизация в том смысле что вместо кучи разрозненных обменов, встроенных в прикладные конфиги (что есть децентрализация) функционал выдран, и перенесен в одну конфигу, которая стандартизирована и формализирована (что есть централизация) — так что особо не заморачивался терминами… 😉

    Reply
  35. FilatovRA

    (33) minimajack, Попробую: Каталоги не являются частью шины. Шина знает о каталогах потому что мы сообщили ей о них через её интерфейс(сеттер). Вопрос оказоустойчивости и доступности ресурсов(папок) в абстрактной шине не рассматривается, т.к. это модель и в данной модели мы по-умолчанию устанавливаем, что шина гарантирует транспортировку пакета между каталогами. Если для примера взять логистику: есть 2 завода, из одного завода в другой нужно доставить тонну груза. В реальном мире мы бы использовали грузовик(т.е. на время транспортировки груз хранится в транспорте), а у нас есть телепорт, которому достаточно сообщить откуда нужно взять груз, и где он должен появиться.

    Reply
  36. minimajack

    (35)

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

    ну если взять сферического коня в вакууме то да, но на компьютере информация все равно будет проходить через участок памяти(буфер) для копирования, типа взяли мы не грузовик, а тележку и перекидываем сколько влезет в буфер и мотаемся туда-сюда так пока все не вывезем…

    хочу увидеть телепорт файлов из одного каталога в другой 😀

    Reply
  37. premierex

    (34) CheBurator, посмотрите вот этот материал и это.

    Скорее всего, поймёте в чём разница (Вы же специалист с большим опытом! 10 лет /а то и больше/ за плечами).

    Reply
  38. CheBurator

    (37) ссылки не открываются

    У инфостарта какаято глубинная проблема — ссылки в публикациях не любит

    Reply
  39. Aleskey_K

    Да, шина вещь хорошая, при большом зоопарке информационных систем.

    Вот ещё мощная разработка http://integration.axelot.ru/products/axelot-esb-servisnaya-shina-dannykh/

    Reply

Leave a Comment

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