В этом уроке вы познакомитесь со стилями взаимодействия приложений: узнаете, чем они отличаются друг от друга, какие преимущества и недостатки есть у каждого из них.
Даня
Нашёл в Оtium интересную функцию! 🧐
Айгуль
Какую?
Даня
Напоминание о премьере фильма или сериала. Запись о событии появляется в твоём календаре, а в нужный день приходит оповещение!
Айгуль
Удобно! А ещё это отличный пример взаимодействия приложений.
Даня
Хм, а у взаимодействий тоже бывают стили?
Айгуль
Ага, а ещё разные режимы! Давай разберём 😉
Взаимодействие приложений
Большинство современных систем состоит из множества независимых распределённых приложений. Они могут быть написаны на разных языках программирования и могут использовать разные форматы данных. Эти приложения взаимодействуют как между собой, так и с приложениями других систем.
Примеры взаимодействия приложений можно найти повсюду: когда вы оставляете заявку, чтобы получить паспорт на портале «Госуслуги», портал взаимодействует с системой МВД; или когда пользователь регистрируется на новом сайте с помощью учётной записи Google, сайт взаимодействует с сервисом авторизации Google.
Взаимодействие независимых друг от друга приложений называют интеграцией. Главная задача интеграции — наладить обмен информацией между приложениями. Для решения этой задачи существует несколько стилей взаимодействия.
Из спринта «Архитектура системы» вы знаете, что стиль — это общепринятый способ организации элементов архитектуры системы, направленный на решение определённой проблемы. Общепринятые способы организации элементов архитектуры взаимодействия приложения также называют стилями.
Если бы все приложения были устроены одинаково, достаточно было бы иметь какой-то единый способ взаимодействия. Многообразие систем, которые разнятся по целям использования, архитектуре и применяемым технологиям, делает процесс интеграции сложным. Реализация взаимодействия между двумя системами — это задача, которая всегда требует индивидуального подхода, профессионализма архитектора и команды разработки. Выбирая способ интеграции, команда должна ориентироваться на несколько важных критериев.
Критерии выбора стиля взаимодействия
Существует несколько критериев, влияющих на выбор стиля взаимодействия приложений:
Надёжность
Выбранный способ взаимодействия должен гарантированно обеспечивать доставку данных от одного приложения к другому.
Степень связанности приложений
При интеграции приложений нужно минимизировать зависимости между ними — уменьшить их связанность. Изменение функциональности одного приложения может привести к нарушению взаимодействия. Низкая связанность необходима, чтобы каждое приложение могло развиваться, не нарушая работоспособности другого.
Простота реализации взаимодействия
Архитектор ПО и команда разработки должны учитывать трудозатраты на интеграцию и соотносить их с качеством полученного решения. Иногда самый простой вариант оказывается самым эффективным, но часто для реализации наилучшего решения приходится прибегать к более сложным и трудозатратным способам интеграции.
Выбор технологии
Некоторые способы интеграции требуют применения специализированного аппаратного и программного обеспечения. Использование дополнительного ПО увеличивает стоимость решения, а также требует от команды разработки дополнительных навыков работы с этим ПО.
Формат данных
При проектировании взаимодействия необходимо учитывать формат данных, которыми обмениваются приложения. Приложения должны поддерживать одинаковые форматы данных или использовать специальное ПО, которое позволяет обмениваться данными в разных форматах.
Своевременность доставки данных
Интеграцию нужно реализовать так, чтобы временной разрыв между передачей данных одной системы и получением этих данных другой системой сократился до минимума. Чем дольше процесс передачи данных, тем выше риск того, что данные успеют устареть.
Общая функциональность
Приложения могут обмениваться не только данными, но и функционалом. Заимствование функций требует особого подхода к проектированию интеграции посредством вызова удалённых процедур.
Режим взаимодействия
Проектируя взаимодействие, нужно определить, блокирует ли его результат дальнейшие действия по сценарию, в рамках которого это взаимодействие было инициировано. То есть может ли приложение продолжить работу, не дожидаясь ответа другого приложения.
Режимы взаимодействия
Существует два режима взаимодействия приложений:
Синхронный.
Асинхронный.
Определить режим взаимодействия (синхронный или асинхронный) поможет вопрос: «Должна ли система дождаться результата запроса, чтобы продолжить работу, или она может переключиться на другие задачи и вернуться за ответом позже?»
Разберём синхронность и асинхронность на примере:
Айгуль ждёт в гости друзей и собирается приготовить на ужин ризотто. Главный ингредиент этого блюда — рис, без него невозможно обойтись. Оказалось, что Айгуль забыла купить рис и не может начать готовить ужин. Но она может попросить друзей купить рис по дороге и приготовить ужин вместе с ними. Это синхронное взаимодействие — отсутствие риса блокирует процесс приготовления ужина.
Теперь представьте другую ситуацию: у Айгуль есть рис, но в конце приготовления ризотто она обычно добавляет в блюдо чеснок. На этот раз у неё нет чеснока, и Айгуль просит друзей купить его по дороге. В этом случае ничего не мешает Айгуль продолжить приготовление ужина — чеснок можно добавить в самом конце или не добавлять совсем.
Преимущества и недостатки режимов взаимодействия
Преимуществом синхронного взаимодействия является его простота для понимания и для реализации.
При синхронном взаимодействии часть кода, отвечающая за обработку ответа, неразрывно связана с частью кода, в которой формируется запрос. Поскольку они вызываются последовательно, такой код проще писать и анализировать.
Недостатки синхронного взаимодействия могут проявляться в следующем:
Если поток входящих запросов слишком большой, сервер не может обработать их все в момент приёма. Ему нужно время, чтобы последовательно пройти по всем запросам и подготовить ответ на каждый из них. То есть сервер предоставит ответ на запрос не сразу. При синхронном взаимодействии сделать это нельзя, так как ответ должен быть предоставлен при получении запроса.
Синхронное взаимодействие может привести к тому, что ответа на стороне клиента придётся долго ждать. Это время часто можно использовать более эффективно: ожидая ответ на один запрос, клиент мог бы заняться другой работой — выполнить запросы, которые не зависят от ещё неполученного результата. В сложных распределённых системах, где все компоненты взаимодействуют между собой синхронно, суммарное падение производительности, связанное с синхронностью, очень велико.
Ещё один существенный недостаток синхронного взаимодействия — снижение показателей отказоустойчивости систем. Система, в которой выполняется синхронное взаимодействие, сможет корректно работать, только если доступны все участники взаимодействия. Если какой-то из компонентов недоступен (например, прервалось соединение с сетью), операция не сможет успешно завершиться.
Недостатки синхронного взаимодействия устраняются при асинхронном взаимодействии.
При асинхронном взаимодействии каждое приложение может обрабатывать поток информации в своём темпе, связанность систем ослабляется, повышается надёжность взаимодействия. Но в то же время теряется преимущество синхронного взаимодействия — простота реализации.
Критерий
Синхронный режим
Асинхронный режим
Сложность реализации
низкая
высокая
Надёжность
низкая
высокая
Степень связанности приложений
высокая
низкая
Определите, какой режим взаимодействия подходит для каждой ситуации.
Синхронное
Покупатель оплачивает товары банковской картой через терминал на кассе
Покупатель оплачивает товары банковской картой через терминал на кассе
Взаимодействие игроков при игре в шахматы
Взаимодействие игроков при игре в шахматы
Переговоры по рации
Переговоры по рации
Асинхронное
Запись на приём к врачу
Запись на приём к врачу
Заказ продуктов домой через сервис доставки
Заказ продуктов домой через сервис доставки
Правильных ответов: 5, неправильных ответов: 0.
Стили взаимодействия
Режимы взаимодействия, формат данных, связанность систем и другие критерии влияют на выбор стиля взаимодействия.
Существует четыре основных стиля взаимодействия:
Передача файлов (File Transfer)
Приложение создаёт файлы с данными, которые необходимы другим приложениям, и использует файлы, созданные другими приложениями.
Общая база данных (Shared Database)
Данные, необходимые разным приложениям, хранятся в одной базе данных.
Удалённый вызов процедур (Remote Procedure Invocation — RPI или Remote Procedure Call — RPC).
Каждое приложение описывает для других приложений процедуры, которые можно вызвать удалённо (например, с другого компьютера), чтобы обменяться данными или дать указания.
Процедурой называют часть программного кода, которая выполняет некоторую функцию. Под вызовом процедуры понимают выполнение функции.
Обмен сообщениями (Messaging)
Приложения связаны общей системой обмена сообщениями, с помощью которой обмениваются данными и дают друг другу указания.
Стили появлялись последовательно, и каждый новый стиль старался устранить несовершенства предыдущего. В то же время новые стили становились более сложным и требовательными к техническому обеспечению и компетенциям специалистов, которые занимаются интеграцией.
В каждой системе потенциально могут применяться разные стили взаимодействия, но только один из них будет оптимальным. Более того, одна и та же система может взаимодействовать в разных стилях с различными сторонними приложениями. Например, CRM может использовать как передачу файлов, так и вызывать процедуры связанных с ней приложений.
Передача файлов
Передача файлов — один из первых стилей взаимодействия. Смысл метода в том, что Приложение «А» передает в приложение «Б» файл в установленном формате (например, XML). В этом файле содержится бизнес-информация, которая требуется приложению «Б» для работы.
В этом стиле необходимо учитывать формат файлов, которыми обмениваются приложения. Зачастую выходной формат представления данных одного приложения не совпадает с входным форматом для загрузки данных другого приложения. Поэтому данные нужно привести к формату, с которым смогут взаимодействовать оба приложения. Иногда для этого используется специализированное ПО.
Передача файлов, как правило, выполняется с использованием FTP (File Transfer Protocol) — стандартного протокола передачи файлов по сети, появившегося задолго до HTTP.
При взаимодействии через передачу файлов отправляющая система не получает подтверждения о том, что принимающая система обработала файл, а принимающая система не получает уведомления о том, что файл выгружен. Каждая из систем должна периодически отслеживать наполнение файлового хранилища. Таким образом, взаимодействие через файловый обмен является асинхронным.
Преимущества стиля:
Простота реализации
Технология выгрузки и загрузки файлов на FTP-сервер проста и общедоступна.
Низкая связанность
Для обеспечения взаимодействия нет необходимости поддерживать постоянную доступность обоих приложений, участников взаимодействия легко заменить.
Свобода в выборе формата данных и возможность передавать большие объёмы данных Ограничение по размеру и формату файла зависит только от самих систем и пропускной способности сети.
Недостатки стиля:
Ненадёжность
Если система-отправитель не выложит файл, система-получатель не получит его.
Увеличение времени доставки данных
Для системы-получателя усложняется задача по организации оперативного и своевременного получения данных. Кроме того, отсутствует возможность проанализировать валидность файла до тех пор, пока он не будет загружен и разобран.
Общая база данных
Самый простой способ организовать для нескольких приложений единое информационное пространство и обеспечить использование общих данных, сделать так, чтобы они использовали единую централизованную базу данных.
Разновидность реализации этого варианта — подход «база к базе». При таком подходе данные передаются из одной базы в другую напрямую, минуя уровень сервера приложений. Для обеспечения прямой передачи данных могут использоваться специализированные инструменты, подключаемые к базам данных.
Например, такой подход целесообразно использовать для наполнения базы данных подсистемы формирования аналитической отчётности, чтобы разгрузить сервер основной системы от выполнения сложных ресурсоёмких операций.
Системы, использующие этот стиль взаимодействия, нельзя назвать ни синхронными, ни асинхронными. При внесении изменений в базу данных нет необходимости ждать реакции от систем.
Преимущества стиля:
Простота в реализации
Общая база данных обеспечивает общий доступ к одним и тем же данным по умолчанию. Поэтому команде разработки не требуется никаких дополнительных усилий, чтобы реализовать передачу данных.
Прямой доступ к модели данных — можно быть уверенным в том, что приложения действительно используют одни и те же данные, есть «единая версия правды».
Недостатки стиля:
Сильная связанность между системами
Использование единой базы данных превращает взаимодействующие приложения в монолитную систему. Изменение в одном приложении повлияют на работу другого.
Несогласованность логики работы с данными
Если разные сервисы будут одновременно менять данные разными способами, это может привести к неконсистентности данных.
Увеличение нагрузки на БД.
Удалённый вызов процедур
Удалённый вызов процедур даёт возможность программному коду, выполняемому на одном компьютере, вызывать код на другом.
При интеграции в RPC-стиле используется понятие «функция». Функции могут выполнять удалённые сервисы.
Каждое приложение или сервис в данном случае рассматривается с точки зрения объектно-ориентированного подхода: как большой объект, который инкапсулирует (объединяет в себе) данные и функции для работы с этими данными. Каждый такой объект предоставляет внешним системам интерфейсы для взаимодействия со своими данными. Проще говоря, приложение «А» удалённо вызывает функцию (метод) приложения «Б», передавая ей нужные параметры.
Таким образом, приложение полностью отвечает за целостность и консистентность своих данных и предоставляет другим приложениям доступ к ним только посредством вызова фиксированного, заранее предопределённого перечня функций. При этом приложения ничего не знают о внутреннем устройстве друг друга.
Стиль RPC, по сути, предполагает синхронный режим взаимодействия: на каждый отправленный запрос система-отправитель ожидает получить ответ от системы-получателя.
Примером реализации удалённого вызова процедур может быть взаимодействие между сервисами интернет-магазина. Предположим, что есть сервис «Заказ», который обращается к сервису «Клиент», чтобы получить информацию о покупателе, и к сервису «Склад» — чтобы получить информацию о доступности товаров. При этом сервис «Заказ» не может создать заказ, пока не получит всю необходимую информацию из других сервисов. В этой системе сервис «Заказ» при получении запроса от покупателя формирует синхронный запрос к сервисам «Клиент» и «Склад» и ждёт от них ответа. Если сервис «Склад» будет недоступен, покупатель не сможет оформить заказ.
Преимущества стиля:
Простота и понятность взаимодействий
Механика взаимодействия в данном случае сводится к простому взаимодействию между сервером и клиентом. Чтобы переписать и доработать код взаимодействия при замене одного из его участников, понадобятся минимальные усилия.
Недостатки стиля:
Высокая степень связанности и общая функциональность
Нужно обеспечивать работоспособность всех задействованных приложений непосредственно в момент взаимодействия, либо усложнять логику реализации системы.
Опасность «взрыва функций»
Новые функции создавать очень легко. Поэтому вместо того, чтобы проводить доработку и рефакторинг существующих функций, есть соблазн добавлять новые. В результате получится огромный перечень дублирующих друг друга функций, в которых трудно разобраться.
Обмен сообщениями
Передача файлов и общая база данных позволяют приложениям обмениваться данными. Удалённый вызов процедур позволяет одному приложению использовать функции другого приложения. Обмен сообщениями же позволяет приложениям как обмениваться данными, так и давать друг другу указания через посредника — систему обмена сообщениями.
Обмен данными и указаниями — это разные способы использования данных сообщения. То есть с точки зрения системы обмена сообщениями все сообщения одинаковы — они содержат какие-то данные, которые надо доставить получателю. С точки зрения команды разработки, сообщения могут нести информацию или указания.
Обмен сообщениями позволяет приложениям отправлять друг другу сообщения быстро, надёжно и асинхронно. Например, с помощью обмена сообщениями разрабатывают мессенджеры и социальные сети.
Преимущества стиля:
Слабая связанность
Слабая связанность достигается за счёт асинхронной передачи сообщений. Приложение-отправитель передаёт данные и продолжает работать, не дожидаясь ответа от приложения-получателя. Приложение-получатель обрабатывает сообщения в своём темпе, а не когда они были отправлены.
Масштабируемость
Если сообщения появляются в очереди быстрее, чем получатель успевает их обработать, можно запустить несколько экземпляров приложения-получателя и дать им параллельно читать сообщения из одной очереди.
Надёжность
Стиль позволяет гарантировать, что данные будут доставлены от приложения «А» к приложению «Б» без потерь.
Возможность передавать бОльшие объёмы данных, чем при других стилях взаимодействия.
Недостатки стиля:
Это самый сложный для реализации стиль взаимодействия.
Высокая стоимость реализации взаимодействия за счёт необходимости использовать дополнительное программное обеспечение.
Так как обмен сообщениями является наиболее популярным стилем взаимодействия, в следующем уроке вы познакомитесь с его элементами и способом их взаимодействия.
Определите стиль взаимодействия, который используется в ситуациях ниже.
Раз в сутки в ночное время CRM-система выгружает на FTP-сервер архив с xml-файлами с актуальным перечнем заявок.
Передача файлов
Использование в системе протокола FTP и выгрузка файлов определённого формата указывает на то, что это передача файлов.
При оформлении заказа в интернет-магазине, реализованном в виде монолитного приложения, пользователь изменил свой основной адрес доставки. Это изменение сразу сохранилось в заказе и в профиле пользователя.
Общая база данных
Изменение адреса сразу сохранилось и в заказе, и в профиле пользователя, значит, они связаны общей базой данных.
При оформлении заказа в интернет-магазине пользователь выбирает способ оплаты «Картой онлайн», его запрос переадресуется на платёжную страницу банка.
Удалённый вызов процедур
Интернет-магазин отправляет запрос на оплату в платёжную систему банка и получает в ответ ссылку для переадресации клиента на платёжную страницу. Это пример вызова процедур.
При обновлении данных пользователя интернет-магазин передаёт актуальную информацию в CRM-систему. CRM-система периодически «разбирает» полученные изменения и актуализирует данные клиентов в соответствии с последним актуальным состоянием на сайте.
Обмен сообщениями
В данном случае и интернет-магазин, и CRM-система работают с данными в своём темпе. Такой вариант взаимодействия обеспечивается посредством обмена сообщениями.
Подведём итоги
Взаимодействие между двумя системами или компонентами системы называют интеграцией. Выбор способа интеграции зависит от множества факторов. Один из основных факторов — режим взаимодействия.
Существует синхронный и асинхронный режим взаимодействия:
Синхронное взаимодействие — блокирующее взаимодействие, при котором клиент не может продолжить выполнение работы, пока не получит ответ.
Асинхронное взаимодействие — не блокирующее взаимодействие, при котором клиент может продолжать работу после отправки запроса.
Общепринятые способы организации взаимодействия приложений называют стилями взаимодействия.
Выделяют четыре основных стиля взаимодействия:
Передача файлов (File Transfer)
Приложение создаёт файлы с данными, которые необходимы другим приложениям, и использует файлы, созданные другими приложениями.
Общая база данных (Shared Database)
Данные, необходимые разным приложениям, хранятся в одной базе данных.
Удалённый вызов процедур (Remote Procedure Invocation — RPI или Remote Procedure Call — RPC)
Каждое приложение описывает для других приложений все процедуры, которые можно вызвать удалённо (например, с другого компьютера), чтобы обменяться данными или дать указания. Процедурой называют часть программного кода, которая выполняет некоторую функцию. Под вызовом процедуры понимают выполнение функции.
Обмен сообщениями (Messaging)
Приложения связаны с общей системой обмена сообщениями, с помощью которой обмениваются данными и дают указания друг другу.
Каждый стиль взаимодействия имеет свои преимущества и недостатки. Определение оптимального стиля и деталей взаимодействия зависит от индивидуальных особенностей каждой конкретной пары системы или её компонентов.
Draggable item. Ensure your screen reader is not in browse mode and then press space bar to lift.