Коммуникация приложений
Проектирование и разработка распределенных программных систем, лекция 4
Компоненты распределенной системы взаимодействуют и обмениваются данными
Сложности при взаимодействии
Ненадежность сети и компонентов
Рассинхронизация состояния
Изменения в компонентах
Как приложения могут взаимодействовать?
Общая БД
Общая БД
Несколько компонентов пишут и читают данные в одной и той же базе данных.
Общая БД: плюсы
Общая БД: минусы
Своя БД у каждого сервиса
Для уменьшения связанности каждый сервис может иметь отдельное хранилище для данных, которые нужны ему для работы.
Данные могут дублироваться между сервисами.
Из-за ошибок при синхронизации данных между сервисами может происходить рассинхронизация их состояний.
Эту проблему решают с помощью регулярной полной синхронизации данных («догонятор»).
Удаленный вызов
Удаленный вызов
Удаленный вызов
Удаленный вызов
REpresentational State Transfer (REST)
REST API
HTTP-метод | Ресурс | Действие |
GET | /users | отдает список пользователей |
GET | /users/123 | отдает существующего пользователя |
POST | /users | создает нового пользователя |
PUT or POST | /user/123 | изменяет или создает пользователя |
DELETE | /user/123 | удаляет существуюшего пользователя |
REST API ≠ HTTP API
Сложности REST API
Возможные решения
GraphQL
Формат данных
Удаленные вызовы: плюсы
Удаленные вызовы: минусы
Обмен сообщениями
Обмен сообщениями
Обмен сообщениями: плюсы
Обмен сообщениями: минусы
Задача
Есть N микросервисов, каждый хранит у себя часть данных. Например: данные о пользователе, оплаты пользователя, начисления и списания продуктов, аналитика мобильного приложения. Заказчик просит сделать endpoint, который вернет данные с возможностью фильтровать и сортировать по любым полям, при этом нужны данные из всех микросервисов. Дополнительно должна быть возможность пагинации. Какие технические решения возможны и как ты будешь выбирать подходящее?
Ходить в БД микросервисов
Собирать данные напрямую из хранилищ, которыми пользуются микросервисы.
Ходить в БД микросервисов
Собирать данные в момент запроса через API
Когда приходит запрос на наш endpoint, делать запросы в другие микросервисы и формировать ответ из их результатов.
В микросервисах должны быть API, через которые мы можем фильтровать данные так, как нам надо.
Собирать данные в момент запроса через API
Регулярно загружать данные через API в свою БД
Периодически по крону делать запросы во все микросервисы, чтобы собрать с них данные и сложить в свою БД.
В микросервисах должны быть API, через которые мы можем полностью выгружать необходимые нам данные.
Регулярно загружать данные через API в свою БД
Собирать данные в свою БД через события
Микросервисы должны отправлять отчетные события о создании, изменении и удалении своих сущностей.
Наш сервис подписывается на события и обновляет свою БД.
В микросервисах должны быть API, через которые мы можем полностью выгружать необходимые нам данные (для догонятора)
Собирать данные в свою БД через события
Итоговое решение?
Итоговое решение
Если бизнесу нужно срочно, делаем быстрое решение, потом заменяем нормальным.
Комбинируем стили взаимодействия по ситуации:
Литература