Часть первая, в которой читатель познакомится с краткой историей появления внутренних продуктов 2ГИС и эволюцией системы доставки данных от нескольких скриптов до полноценного приложения.

Сегодня я расскажу вам историю, которая началась 9 лет назад в компании ДубльГИС.

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

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

Поехали. Далекий 2010 год. Тогда 2ГИС был еще ламповым ДубльГИСом, из внешних продуктов была настольная версия и примитивный онлайн и версия для КПК. А внутренности состояли из системы доставки обновления пользователям нашей ПК версии и монстра под названием DGPP, который совмещал в себе инструменты для редактирования справочника организаций и карты, CRM и экспорта данных в конечные продукты. База данных лежала в Firebird. Cистема была децентрализована. В каждом городе была своя инсталляция и своя БД. Примитивная интеграция обеспечивалась через файловые экспорты / импорты. И на этом, по большому счету, все.



Сам DGPP представлял из себя приложение на C++ с набором VBA-скриптов. Изначально эту систему для ДубльГИСа разрабатывала сторонняя контора, и лишь со временем разработку системы компания забрала под свою крышу, сформировав собственный R&D. Развивать DGPP становилось все сложнее и сложнее.

А это было время начала бурного развития ДубльГИСа. Открывались новые города. Готовилась мобильная версия для смартфонов. Появлялись новые фичи. Развивалась рекламная модель. В общем, требовалось большое количество изменений, и делать их нужно было быстро.

Первое, с чего мы начали разбирать DGPP на кусочки, стал экспорт. Мы вытащили его в отдельное приложение, представляющее из себя windows service с мордой на WPF. Параллельно велась работа над новой CRM. Для экономии времени на тот момент в качестве базовой платформы был выбран Microsoft Dynamics CRM.



Что касается экспорта, нужно было просто научиться добывать данные из Firebird и вытащить всю логику подготовки данных из VBA-скриптов. Кроме того, были некоторые алгоритмы для данных транспорта, реализованные на плюсах. Их пришлось переписать на шарпы.

Тут стоит обратить внимание на один момент. Наш десктопный ДубльГИС потреблял данные в специальном бинарном формате, который готовился библиотекой на C++, обернутой в COM-объект. И тогда было вполне логично использовать его, просто подключив как reference в проект. Не самое удачное решение, но об этом я расскажу после.

Время шло, мы зарелизили мобильную версию и новую CRM. На горизонте забрезжил новый внешний продукт — публичное API 2ГИС. А из DGPP уже начали вычленять подсистему для работы со справочником организаций под кодовым названием InfoRussia.

В экспорте возникла необходимость читать рекламные данные уже из двух систем: старого DGPP и новой CRM. Причем внедрение CRM шло постепенно, т. е. в одних городах пока оставался только DGPP, а в других работали одновременно DGPP со справочником и картой и CRM с коммерческой информацией. Кроме того, в перспективе светил релиз InfoRussia, который состоялся в течение нескольких месяцев.



Новые системы вносили сложности не только своим появлением. Они изменили концепцию развертывания. В отличие от децентрализованного DGPP, который стоял в каждом городе, эти системы были централизованы, каждая со своей толстенькой СУБД. Кроме того, им необходимо было обмениваться данными.

Для решения этой задачи мы реализовали свою Enterprise Service Bus (ESB). На тот момент практически не было зрелых решений, которые бы обеспечивали выполнение некоторых важных для нас функциональных требований: возможность передачи XML, порядок сообщений и гарантию доставки. Тогда мы остановились на SQL Server Broker, который давал из коробки все, что требовалось. Правда, обладал довольно посредственной скоростью доставки, но нас на тот момент она вполне устраивала.

Последним шагом стал релиз картографического сервиса под названием Fiji. Он частично выгружал свои данные в шину. Это касалось справочников и классификаторов. Геоданные можно было забирать у него через Rest API, которым пользовался и сам клиент Fiji, написанный на WPF.



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

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

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



И вот моя история подошла к концу.

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

Комментарии (11)


  1. babylon
    21.08.2019 18:19

    Cлой Общественный транспорт будет сделан?


    1. vloboda Автор
      21.08.2019 18:52

      Общественный транспорт на картах 2гис присутствует. О каком "слое" идёт речь?


      1. Andrusha
        22.08.2019 02:49
        +1

        Сейчас она работает в формате «выбрал остановку — выбрал маршрут — отобразился транспорт этого маршрута», а под слоем, как я понимаю, имеется в виду реализация, аналогичная Яндекс.Транспорту — просто показывать все возможные транспортные средства на карте, а уже при нажатии на любом из них показывается его маршрут. И выключатель, как у пробок.


        1. vloboda Автор
          22.08.2019 05:14
          +1

          Если речь именно о движении общественного транспорта — то да, реализация как вы описали. Как пользоваться написано тут.
          О планах по реализации отдельного слоя для этих данных мне ничего неизвестно, уточню у коллег.


  1. pashuk
    21.08.2019 18:24

    Судя по ажиотажу в комментариях тема не очень зашла.


    1. vloboda Автор
      21.08.2019 18:56

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


      1. dmitryanufriev
        22.08.2019 09:13

        Да что там набросить… увидел Buildman и всплакнул. Ностальгия :).


  1. vsespb
    21.08.2019 19:18

    После появления Exportа он лез в Firebird. DGPP тоже лез в Firebird. Т.е. у Export и DGPP была общая база Firebird.

    Вопрос. Не было ли проблем с тем что, в процессе развития продукта (добавления новой фичи и т.п.) нужно модифицировать структуру БД,
    и нужно было править одновременно и код Export и код DGPP? И мало того что править, так и релизить правки в один момент.

    И с какого момента Export перестал лезть в базу? Как удалось базу заменить на ESB?


    1. vloboda Автор
      22.08.2019 05:34

      Вы всё верно подметили, база была общая.

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

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

      Лезть в базу DGPP экспорт перестал в момент смерти первого. А как удалось его заменить на чтение из ESB я расскажу в следующей статье, выйдет через недельку.


  1. SbWereWolf
    23.08.2019 09:52

    А это было время начала бурного развития ДубльГИСа. Открывались новые города. Готовилась мобильная версия. Появлялись новые фичи.

    Нет автор, вы не правы. Я работал в 2гисе в 2006-2007 годах и вот тогда появилась первая мобильная версия, и я пользователям про неё рассказывал, как поставить и как работать, надо было скачать файл приложения с сайта 2гиса, наверное потому что это была версия не для смартфона, в смысле не для Андроида, которого на тот момент ещё наверное не было.
    На в начале 2006-ого 2гис был в 13 городах, и кажется на Украине в Одессе, и это называлось бурным ростом, франшизы чуть ли не каждый месяц открывались по всей стране.


    1. vloboda Автор
      23.08.2019 11:51

      Да, вы правы, была версия для КПК в 2006 году. Поправил в статье, что готовилась мобильная версия для смартфонов, чтоб не было неоднозначностей.

      А по поводу бурного роста я же не говорил, что он начался с моим приходом. Рост может продолжаться довольно долго ведь. В начале 2010 года у нас было порядка 20 крупных городов, сейчас — больше 120, да и география стран то же расширилась. RND состоял из нескольких десятков человек, сейчас в несколько раз больше. Не вижу здесь противоречий).