1 of 49

Коммуникация приложений

Проектирование и разработка распределенных программных систем, лекция 4

2 of 49

3 of 49

Компоненты распределенной системы взаимодействуют и обмениваются данными

4 of 49

Сложности при взаимодействии

  • Ненадежность сети и компонентов
  • Рассинхронизация состояния
  • Изменения в компонентах

5 of 49

Ненадежность сети и компонентов

  • Ошибки
  • Запрос не дошел
  • Сервис упал

6 of 49

Рассинхронизация состояния

  • Невозможно моментально распространять информацию в распределенной системе

7 of 49

Изменения в компонентах

  • Изменения в одном компоненте не должны повлиять на другие компоненты
  • Должна быть возможность адаптироваться под новый формат взаимодействия

8 of 49

Как приложения могут взаимодействовать?

  • Общая БД
  • Удаленный вызов
  • Обмен сообщениями

9 of 49

Общая БД

10 of 49

Общая БД

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

11 of 49

12 of 49

Общая БД: плюсы

  • Легко реализовать
  • Поддерживается везде
  • Данные между сервисами согласованы

13 of 49

Общая БД: минусы

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

14 of 49

Своя БД у каждого сервиса

Для уменьшения связанности каждый сервис может иметь отдельное хранилище для данных, которые нужны ему для работы.

Данные могут дублироваться между сервисами.

15 of 49

Из-за ошибок при синхронизации данных между сервисами может происходить рассинхронизация их состояний.

Эту проблему решают с помощью регулярной полной синхронизации данных («догонятор»).

16 of 49

Удаленный вызов

17 of 49

18 of 49

Удаленный вызов

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

19 of 49

Удаленный вызов

  • RPC
  • SOAP
  • CORBA
  • HTTP API

20 of 49

Удаленный вызов

  • RPC gRPC
  • SOAP
  • CORBA
  • HTTP API

21 of 49

REpresentational State Transfer (REST)

  • Сервер без состояния
  • Ресурсы
  • Методы ресурсов

22 of 49

REST API

HTTP-метод

Ресурс

Действие

GET

/users

отдает список пользователей

GET

/users/123

отдает существующего пользователя

POST

/users

создает нового пользователя

PUT or POST

/user/123

изменяет или создает пользователя

DELETE

/user/123

удаляет существуюшего пользователя

23 of 49

REST API ≠ HTTP API

24 of 49

Сложности REST API

  • Как осуществлять действия, не вписывающиеся в стандартные глаголы?
  • Как отдавать вложенные ресурсы?

25 of 49

Возможные решения

  • HTTP API без REST
  • GraphQL

26 of 49

GraphQL

27 of 49

Формат данных

  • XML
  • JSON
  • Protocol buffers

28 of 49

Удаленные вызовы: плюсы

  • Стандартизация
  • Не требует дополнительной инфраструктуры
  • Можно сохранять внешний интерфейс, меняя внутреннюю реализацию компонента

29 of 49

Удаленные вызовы: минусы

  • Снижает скорость обработки запросов
  • Сервер должен быть доступен, чтобы ответить
    • Нужно предотвращать каскадные отказы

30 of 49

Обмен сообщениями

31 of 49

32 of 49

Обмен сообщениями

  • Сообщение отправляется в брокер сообщений (например, RabbitMQ)
  • Отправитель не ожидает ответа (асинхронный вызов, хореография)
  • Получатели подписываются на определенные сообщения и обрабатывают их в порядке очереди
  • Отправитель не получает ответа от получателя

33 of 49

Обмен сообщениями: плюсы

  • Очень слабая связанность компонентов
  • Регулируемая нагрузка
  • Не требуется одновременная доступность отправителя и получателя
  • Хорошо подходит для длительных задач

34 of 49

Обмен сообщениями: минусы

  • Сложная модель программирования
  • Требуется дополнительная инфраструктура
  • Очередь может стать узким местом в производительности
  • Несогласованность данных

35 of 49

Задача

36 of 49

Есть N микросервисов, каждый хранит у себя часть данных. Например: данные о пользователе, оплаты пользователя, начисления и списания продуктов, аналитика мобильного приложения. Заказчик просит сделать endpoint, который вернет данные с возможностью фильтровать и сортировать по любым полям, при этом нужны данные из всех микросервисов. Дополнительно должна быть возможность пагинации. Какие технические решения возможны и как ты будешь выбирать подходящее?

37 of 49

Ходить в БД микросервисов

Собирать данные напрямую из хранилищ, которыми пользуются микросервисы.

38 of 49

Ходить в БД микросервисов

  • Можно сделать легко и быстро
  • Не нужно вносить изменения в микросервисы
  • Данные максимально актуальные

  • Сломается на следующий день

39 of 49

Собирать данные в момент запроса через API

Когда приходит запрос на наш endpoint, делать запросы в другие микросервисы и формировать ответ из их результатов.

В микросервисах должны быть API, через которые мы можем фильтровать данные так, как нам надо.

40 of 49

Собирать данные в момент запроса через API

  • Почти так же легко и быстро, как общая БД
  • Интерфейс API не поменяется без предупреждения

  • Может потребоваться работа на стороне микросервисов
  • Ответ будет формировать долго
  • Не получится реализовать все виды фильтрации и пагинацию
  • Не cможем обработать запрос, если какой-то из N микросервисов упадет

41 of 49

Регулярно загружать данные через API в свою БД

Периодически по крону делать запросы во все микросервисы, чтобы собрать с них данные и сложить в свою БД.

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

42 of 49

Регулярно загружать данные через API в свою БД

  • Все данные у нас, можно быстро выбрать нужные
  • Можно использовать идеально подходящую модель данных

  • Может потребоваться работа на стороне микросервисов
  • Больше работы на нашей стороне
  • Рассинхронизация данных (в рамках часа)

43 of 49

Собирать данные в свою БД через события

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

Наш сервис подписывается на события и обновляет свою БД.

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

44 of 49

Собирать данные в свою БД через события

  • Быстрая выборка данных
  • Идеальная модель данных
  • Слабая связанность с другими микросервисами
  • Небольшая рассинхронизация (до нескольких секунд)

  • Может потребоваться работа на стороне микросервисов
  • Много работы на нашей стороне

45 of 49

Итоговое решение?

46 of 49

Итоговое решение

Если бизнесу нужно срочно, делаем быстрое решение, потом заменяем нормальным.

Комбинируем стили взаимодействия по ситуации:

  • Данные меняются редко — периодически опрашиваем
  • Данные не используются для фильтрации — обогащаем на лету
  • Нужны актуальные данные — подписываемся на события

47 of 49

Литература

48 of 49

49 of 49