Эволюция: из маленькой веб-студии в опытного интегратора

Мы быстро поняли, делать простые сайты — невыгодно. Конкуренция возрастала, рынок наводнялся небольшими компаниями. Всё это привело к снижению цен на проекты и падению прибыльности бизнеса. Заказчики становились квалифицированнее. Запросы на создание сайтов дополнялись требованиями «привязать» их к той или иной информационной системе.

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

Наша Студия всегда располагалась в российской «силиконовой долине» — Зеленограде. У нас были сильные программисты, а значит мы могли легко получать и выполнять такие заказы. Было решёно — это наш шанс!

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

Какая гадость эта ваша веб-интеграция

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

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

Мы не сдавались, и, словно мышки из анекдота, «кололись, плакали, но упорно продолжали грызть кактус».

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

Перед тем как приступить

Прежде чем рассказать о процессах, договоримся о терминологии этой статьи.

Для нас, программистов, любая разработка несложных сайтов сводится к такой модели:

Когда нужно создать не просто веб-сайт, а целую систему, где помимо БД сайта задействованы ещё и кассовый аппарат с кассиром, продающим билеты в театр, складская система, предоставляющая сведения об остатках товаров, или платёжный сервис, отвечающий за процессинг банковских карт, мы используем понятие «третья сторона».

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

Шаг 1. Цели и задачи

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

Типичный пример: Сайт должен быть интегрирован с билетной системой ProfTicket.

и стараемся в таких случаях добиться большей однозначности формулировки:

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

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

Шаг 2. Бизнес-процессы и протокол взаимодействия

Теперь нужно решить, как системы должны взаимодействовать для выполнения той или иной задачи. Продолжим строить аналогии с билетной системой. Кстати, речь идет о совершенно реальном проекте: в 2013 году мы помогли компании «Дилявер» открыть сервис заказа билетов ShowMart.Ru. Для выполнения бронирования билета необходимо ответить на несколько вопросов:

  • Какое мероприятие выбрал покупатель?
  • Какой сеанс (сочетание даты и времени) был выбран?
  • Какие места (номер сектора, ряд и кресла) были выбраны?
  • Не были ли проданы эти места другому покупателю ранее?
  • Не находятся ли данные места в резерве, иными словами, не происходит ли оформление покупки этих мест другим покупателем прямо сейчас?
  • И так далее...

Любое взаимодействие между системами сводится к структуре «запрос — ответ». Запрос отправляет сторона, которой необходимо получить данные (клиент), а ответ — сторона, у которой эти данные есть (сервер).

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

В какой-то момент нам нужно будет «попросить» одну из систем зарезервировать билеты — проставить отметку, не позволяющую продать эти билеты повторно другому покупателю, а после оформления покупки одна из систем должна будет отправить покупателю письмо-уведомление. Поэтому иногда требуется взаимодействие не на уровне «запрос — ответ», а по формуле «запрос — действие».

Процесс взаимодействия сторонТеперь нам остаётся только зафиксировать, за какие запросы и ответы ответственна каждая из систем. А также указать перечь всех возможных ошибок.

Шаг 3. Регламент принятия решений и медиаторы

Даже в самом простом проекте веб-интеграции принимают участие как минимум три стороны:

  1. Заказчик.
  2. Владелец системы А (например, 1С-программист в штате клиента).
  3. Владелец системы Б (собственно, мы — веб-программисты).

Не будем углубляться в причины и анализ происходящего. Просто зафиксируем как факт: возникновение конфликтов интересов между владельцами двух систем неизбежны. Сложность ситуации зависит от числа участников и уровня их квалификации.

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

  • Чем стороны будут руководствоваться при принятии решения: быстродействием, вопросами безопасности данных или минимальными изменениями в 1С?
  • Кто будет ответственной стороной, принимающей последнее решение, в том случае, если владельцы систем не могут договориться между собой?

На первый взгляд кажется, что ответ на последний вопрос очевиден: заказчик — кому же еще принимать окончательные решения? Однако, это не всегда так.

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

Шаг 4. Стандарт и формат обмена данными

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

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

SOAP

SOAP расшифровывается, как Simple Object Access Protocol. Если дословно переводить с английского, то получится «Простой Протокол Доступа к Объектам». Этот протокол действительно является одним из самых простых и часто используемых при построении веб-проектов. SOAP представляет собой протокол обмена структурированными XML-сообщениями.

Пример SOAP-запросаПример SOAP-запроса

Для того чтобы системы использовали единый регламент построения запросов и ответов, используются файлы c описанием такого регламента, составленным на основе стандарта WSDL (от англ. Web Service Description Language — Язык Описания Веб-Сервисов).

Пример WSDL-файла

SOAP является расширением протокола XML-RPC, и это большой плюс протокола. XML широко распространен, и с форматом XML-Schema хотя бы поверхностно знакомо огромное число специалистов.

Этот же факт является и самым большим минусом SOAP. XML — объёмный формат и с ростом количества данных, которыми обмениваются системы, растет количество передаваемого трафика. С ростом последнего увеличивается время, необходимое на обработку запросов и формирование ответов на них. Всё это делает связку WSDL/SOAP практически непригодной для использования в системах с огромными объёмами плохо структурированных данных — в так называемых Big Data-системах.

SOAP станет отличным выбором, например, для решения задач интеграции интернет-магазина с небольшим ассортиментом со складской системой 1С. В её стандартной поставке предусмотрена поддержка этого протокола, и всё, что останется сделать, подготовить WSDL-описания.

REST

REST (расшифровка аббревиатуры в данном случае нам ничего не даст, поэтому мы ей пренебрежем) — это протокол вызова удаленной процедуры с помощью обычного HTTP-запроса. Да-да, с помощью тех самых методов GET и POST из учебников Тима О’Райли.

За каждый метод в REST отвечает не отдельно взятая запись в файле WSDL, а URL. К примеру, метод для получения сведений о пользователе будет иметь вид — http://example.com/rest/user. А метод создания нового пользователя — http://example.com/rest/user/create.

Для передачи параметров в REST можно использовать тело запроса, а для описания ошибок — статусные заголовки HTTP. Всё максимально просто и не требует использования дополнительных протоколов. REST гораздо примитивнее SOAP. Именно это делает его отличным выбором, когда нужно обмениваться большим объёмом данных и делать это часто.

REST не диктует, в каком формате передавать запросы. А значит для этих целей можно использовать JSON (текстовый формат обмена данными) — самый компактный формат обмена структур в текстовом представлении. Его использование практически полностью решает проблему объёма данных.

ВЕЛОСИПЕД

Иногда приходится использовать комбинации нескольких методов и протоколов взаимодействия.

В 1С есть собственный формат CommerceML — XML для передачи коммерческой информации, чаще всего таким способом передаются каталоги товаров.

Этот формат разработан специалистами фирм 1С и Extra.RU. Им помогали друзья из московского офиса Microsoft.

По этой причине формат не предусматривает многих вариантов использования, и «чистого» CommerceML часто не хватает. Это приводит к необходимости дополнения его специальным функционалом.

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

В случаях когда нужно постоянно поддерживать данные в актуальном состоянии, мы можем связать Rest API и передачу XML вместе. Тогда 1С будет отправлять XML напрямую на сервер, используя стандартные POST-запросы.

Шаг 5. Безопасность данных

Чаще всего там, где возникает необходимость в интеграции, есть объекты коммерческой тайны или персональные данные. Работа с ними после недавних изменений в законодательстве теперь заслуживает отдельной статьи.

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

Вариантов защиты много. Мы рассмотрим только некоторые из них.

HTTPS

Протокол HTTP — самый распространенный и самый незащищенный. Данные по нему передаются в незашифрованном виде. HTTPS — это разновидность http-протокола, поддерживающая шифрование с использованием сертификатов SSL или TCL.

Сертификаты — это алгоритм, по которому будет происходить шифрование данных. Об этом алгоритме знают только передающая и принимающая стороны в момент передачи данных. SSL-сертификаты могут поставляться самим сервером, но тогда они будут считаться недоверенными, и браузеры могут выдавать пугающие пользователя картинки.

Окно предупреждения пользователя о недостоверном соединенииДля того чтобы сертификат считался доверенным, его необходимо заказывать у организации, занимающейся сертификацией — центра сертификации. Таких учреждений много. Работая над проектами европейских заказчиков, мы предпочитаем пользоваться услугами одного из двух крупнейших игроков на рынке SSL-сертификации — Thawte или Verisign. В России работаем с Ру-центром. Их значки можно часто видеть на сайтах, где подразумевается оплата или работа с персональными данными.

HTTP-Basic авторизация

Вторым методом обеспечения защиты является способ, при котором две системы «представляются» друг другу с помощью пары «логин — пароль» до того, как начать обмениваться данными. Такой метод называется «HTTP-basic авторизация».

Чтобы злоумышленники не смогли перехватить пароли, «представляться» системам лучше в шифрованном виде, т.е. HTTP-basic авторизацию надо использовать совместно с SSL-шифрованием.

Предоставление доступа по IP-адресу

Если система не слишком сложна и у серверов взаимодействующих систем есть определенные и неизменные IP-адреса, можно предоставлять доступ к обмену данными только для этих IP-адресов.

Этот вариант прост в реализации и поэтому широко распространен. Но иногда он приводит к внезапным проблемам с доступом.

Шаг 6. Техническое задание

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

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

В процессе практической тесной работы, которая заняла не один месяц, 1С-программисты изменили свою точку зрения и приняли решения сделать для нас копию своей БД, реплицированную с главной и передать ее нам для того, чтобы мы «делали с ней все, что захотим».

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

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

Вы можете работать по гибким методологиям, использовать классический «водопад» или применять гибридную методику. Это не важно, также как и формат и объем ТЗ. Важно только то, что все договоренности должны быть так или иначе зафиксированы.

Шаг 7. Реализация

В непосредственном производстве работ по интеграции тоже есть несколько отличий от моноразработки.

ЕДИНАЯ КОМАНДА

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

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

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

ТЕСТИРОВАНИЕ НА ВХОДЕ

Работая с третьей стороной, придется заниматься тестированием не только «на выходе», но и «на входе».

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

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

ПОКРЫТИЕ ТЕСТАМИ

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

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

В случае веб-интеграции процент покрытия кода тестами должен быть как можно более высоким.

Шаг 8. Отказоустойчивость

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

Некоторые из проектов, выполненных нами, могут потерять от $35 000 до $70 000 в случае суточного простоя. Это заставляет дополнительно задумываться о мероприятиях повышения отказоустойчивости всей системы.

  • Резервное копирование. Все это прописывают в ТЗ и договорах. Но давайте будем честны, вы всегда проверяете, действительно ли хостер или разработчик настроил процедуры резервного копирования в соответствии с договоренностями? Чаще всего это выясняется тогда, когда беда уже произошла.
  • Нагрузочное тестирование. На какую посещаемость и пиковую нагрузку рассчитывает заказчик? Умножьте эту цифру хотя бы на 2,5 и сделайте синтетические нагрузочные тесты. Тестировать нужно не только сайт, но и те системы, с которыми взаимодействует проект.
  • Сезонность. Знайте сезонность бизнеса своего заказчика. Посещаемость сайта сети кинотеатров, который мы сделали и поддерживаем, в новогодние праздники возрастает в 2-3 раза. В этом проекте мы начинаем подготовку к Новому году в начале ноября.
  • Готовность к «откату». Вы работаете в команде, и это придется учитывать. Будьте готовы к тому, что ваши новые функции могут нарушить нормальную работу внешней системы и изменения придется быстро «откатить» назад. Несмотря на нагрузочное тестирование, внешние системы иногда выходят из строя по независящим от вас причинам. Вы должны быть готовы продолжить работу, отключив на время совместный функционал. Например, во время аварии сервиса покупки билетов вместо процесса оформления заказа мы показываем сообщение с извинениями, но сам сайт продолжает свою работу.

Шаг 9. Логирование и мониторинг

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

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

В Студии мы стараемся сделать всё так, чтобы о выходе из строя сайта или его части узнавать не из телефонного разговора с разъярённым клиентом, а при помощи собственных систем мониторинга.

Мы не станем подробно затрагивать этот процесс и, может быть, посвятим этому отдельную статью, но для тех, кто плохо знаком с этими темами, советуем начать с гугления терминов Pinba, Zabbix и Munin.

Шаг 10. Документирование

Договоритесь о том, в каком виде будет вестись проектная документация, и постарайтесь держать её в актуальном состоянии.

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

Совет самый простой по смыслу и самый сложный по соблюдению. Мы в Студии стараемся это делать примерно так:

  • Договорились о формате ведения и месте хранения проектной документации.
  • Составили перечень документов, входящих в понятие «проектная документация». Как правило это несколько документов, включая карту бизнес-процессов, описание серверной архитектуры, наше ТЗ, документация на API внешней системы, и т.д.
  • Назначили ответственного за актуальность документации. Обычно это руководитель проекта.
  • Назначили периодичность проверки документации.

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

Заключение

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

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

Просьба: сейчас в Студии мы пытаемся понять, заинтересованы ли вы в прочтении подобных статей? Чтобы сделать материал полезным и практичным, требуются очень большие усилия. На подготовку этой статьи ушло около 20 часов трёх специалистов.

Наш арт-директор Саша Котов считает, что мы «маемся дурью», и это никто читать не будет :-)

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