ArchTalks: интеграционная архитектура — итоги.

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

Предистория

Идея подобного рода встреч родилась давно. По сути в основе конференции ArchDays лежат те же идеи, а именно:

«распространение имеющихся и создание новых знаний о микросервисах и эволюционной архитектуре»

Но микросервисная архитектура — это лишь небольшой пласт информации об архитектуре и видение эволюционировало в:

«ArchDays — это площадка, где мы не только распространяем накопленные знания, но так же создаем новые концепции и решаем совместно прикладные задачи»

Видение привело к вполне конкретным целям встречи:

  • Помочь друг другу получить более стабильные, интересные, надежные и эффективные архитектурные решения быстрее
  • Учиться друг у друга, расти профессионально, развиваться, заводить новые знакомства, приятно провести время в кругу единомышленников и друзей
  • Делиться результатами со всеми, кому это может быть интересно, тем самым вкладываясь в развитие индустрии в целом
На изображении может находиться: текст

Сообщество идею и цели поддержало, огромное спасибо всем и каждому в отдельности! Встреча прошла очень конструктивно и продуктивно.

Архитектурная задача

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

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

Основные требования

Географическая распределенность: сервера центрального кластера МСК/СПБ и региональные брокеры макрорегионов.

Важные для решения атрибуты качества и ограничения

  • Обеспечение гарантированной одноразовой доставки сообщений (guaranteed delivery, exactly once).
  • Способность корректно поддерживать в распределенную отказоустойчивую конфигурацию. Существующая конфигурация предполагает наличие не менее чем четырех инстансов приложения, попарно развёрнутых в датацентрах Москвы и Санкт-Петербурга.
  • Интеграционная архитектура должна обеспеченить пропускную способность 1000+ сообщений в минуту и минимальные задержки (единицы, самое большее десятки миллисекунд при нормальных условиях) доставки сообщений. В том числе при работе с удаленными (региональными) клиентами по ограниченному каналу.
  • Механизмы восстановления после сбоев, в том числе защита от split-brain.
  • Наличие удобного и информативного административного инструментария для диагностики и настройки.
  • Наличие клиентов под распространённые платформы (Java, .NET, C / C++).
  • Максимально автоматизированный failover клиентов.Чтобы при выходе из строя части кластера, клиенты могли с минимальным дополнительным кодированием реализовать переключение на работоспособную часть кластера.
  • Бесплатность

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

При развёртывании кластера кафки в конфигурации «две площадки по три ноды», потеря связи между площадками приводит к неработоспособности обеих половинок кластера из-за невозможности достижения кворума zookeeper-ом.

Примечание: в ходе обсуждения было предложено добавить третью площадку. Зафиксировали вариант и двинулись дальше.

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

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

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

Дополнительный контекст

В ходе предварительного обсуждения в группе facebook выяснился еще ряд важных особенностей.

Что с ограничениями по ресурсам? Время, деньги, люди какой квалификации и специализации?

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

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

По деньгам — главное, чтобы решение было бесплатным, чтобы материалы по нему присутствовали в публичном доступе, чтобы необходимые плагины и конфигурации также поддерживались на бесплатном уровне. Что-то вроде RabbitMQ — ОК, где коммерческие фичи больше про поддержку и консультации, а что-то как Akka — не ОК, где половина функций, нужная в распределенной системе идет за отдельную плату.

По квалификации — в команде сейчас в основном хорошие Java и .NET специалисты, хотелось бы, чтобы решение было доступно им для понимания. Что-то хардкорное вроде кастомной надстройки над ZeroMQ — наверное можно подумать, но лучше избежать 🙂»

Есть ли какие-то зависимости между сообщениями?

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

Как и где исполняются эти бизнес-процессы? Центрально или каждая задача в БП может быть исполнена в любом месте?

«Сейчас есть два основных сценария.

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

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

Какой размер сообщений?

«Сообщения размером максимум в единицы килобайт, обычный JSON или XML. Есть пара сценариев с передачей бинарных потоков через шину (загрузка файлов из удаленных источников). При необходимости можно скорректировать реализацию и передавать файлы в обход шины. Либо сериализовывать в Base64 — размер файлов в пределах 1-10 мегабайт.»

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

  • Что с ограничениями по ресурсам? Время, деньги, люди какой квалификации и специализации?
  • Есть ли какие-то зависимости между сообщениями?
  • Как и где исполняются бизнес-процессы? Центрально или каждая задача в БП может быть исполнена в любом месте?
  • Какой размер сообщений?

Начинаем!

Для начала, еще раз спасибо всем, кто пришел:

Участники митапа

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

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

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

Обсуждение целевого решения на одной из станций

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

Или трудности с синхронизацией каналов связи. Их физически три: голос. (SIP), SMS и канал служебных сообщений. Трудность в том, что сообщения по каналам могут идти с различной задержкой. Так давайте уберем канал служебных сообщений? Пусть они идет по SIP каналу в заголовках. На один канал меньше, ситуация упростилась.

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

Презентация архитектурного решения с использованием mesh
Презентация архитектурного решения с использованием деления по компонентам
Презентация архитектурного решения на уровне логической архитектуры
Презентация архитектурного решения с арбитром

По отзывам встреча была полезна и интересна всем, что улучшать — известно, будем продолжать!

Share