Size: a a a

Архитектура ИТ-решений

2020 September 05

I

Ivan in Архитектура ИТ-решений
Gennadiy Kruglov
Много написано, возможно я как-то неправильно интерптерирую контекст.

Если я правильно понял, мы решаем задачу сихнронизации данных между BC и/или между двумя микросервисами в рамках одного BC, с сохранением атономности микросервисов и их баз прежде всего. Эту задачу можно решить несколькокими способами, вот два из них:
1) При событийно-ориентированной архитектуре "зависимый" микросервис, причём не важно, в одном BC или нет, слушает изменения и обновляет у себя некое внутреннее представление. При этом, микросервисы должны публиковать все изменения, что не проблема  при наличии современных pub/sub продуктов. На самом деле мы и так публикуем все изменения, они потом пишутся в лог Hadoop, например, индексируются Эластиком и т.д.
2) Использовать CQRS - то есть микросервисы выставляют адаптированные для чтения представления (read model), которые могут читать другие микросервисы напрямую. Но нужно понимать, что при этом структура этих представлений и параметры подключения к ним становятся частью контракта. В случае EventSourcing выставлюятся не представления, а проекции. @emacsway поправь пожалуйста если я заблуждаюсь.

При этом, в обоих случаях агрегация выполняется в зависимом микросервисе "заказы".

Bff предназначен для формирования "внешнего" API под конкретный клиент (фронт/мобайл), при этом Bff выполняет агрегацию "внутренних" API.  Bff должен минимум логики содержать и  делать только минимум из того, что нужно для "внешнего" API на основе вызовов "внутренних" API. По сути это вариант паттерна Facade. Иначе логика переедет в Bff, то есть всё что мы не сделали в микросервисе "заказы", переедет с большой вероятностью в Bff. Отличный вариант!:)

Почему так. Тут все "пляски" вокруг автономности БД микросервисов. Зачем нужна автономность? Чтобы кто-то с наружи не уронил запросами БД (модель изменения в терминах CQRS) и чтобы микросервис мог произвольно изменять структуру своей БД (своих таблиц при Monolith First). Оба варианта решают задачу автономности модели изменений, а модели чтения итак адаптированы под запросы извне и должны хорошо масштабироваться на чтение.

При этом 1-й вариант лучше, потому что он обеспечивает полную автономность, не нужно заботиться о соблюдении контракта представлений (структур вьюх) и их масштабировании. Единственный недостаток 1-го варианта, больше данных ходят по очередям.

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

И мы конечно понимаем, что в любом случае речь о согласованности в конечном итоге.
Да, но я пока не увидел аргументов  о том, что эти данные нужны сервису, а не клиенту (может быть я просто невнимательно смотрел). Наверное, именно поэтому, @dphil и заговорил о BFF.
источник

GK

Gennadiy Kruglov in Архитектура ИТ-решений
Ivan
Да, но я пока не увидел аргументов  о том, что эти данные нужны сервису, а не клиенту (может быть я просто невнимательно смотрел). Наверное, именно поэтому, @dphil и заговорил о BFF.
Данные нужны клиенту в контексте заказа. Заказ неразрывно связан с клиентом.
источник

I

Ilya in Архитектура ИТ-решений
Вот нашел список когнитивных искажений. Думаю, весьма важная часть работы архитектора уметь их выявлять.
источник

I

Ilya in Архитектура ИТ-решений
источник

GK

Gennadiy Kruglov in Архитектура ИТ-решений
Иными словами, какая-то часть клиентских данных ВСЕГДА является частью заказа. То есть, какая-то часть клиентских данных должна входить в состав агрегата  "Заказ", но этот агрегат ими не владеет, а только использует.

В случае с Bff мы "собираем" заказ в Bff, а не в микросервисе "Заказ" (условно).

Чтобы использовать, нужно либо подписаться и хранить копию (вариант 1), либо ходить за ними, когда нужно. Ходить можно по API или непосредственно за данными. Непосредственно за данными лучше ходить к представлению на чтение (вариант 2).
источник

PD

Phil Delgyado in Архитектура ИТ-решений
Сергей
Верно, но обогащение данных в этом случае происходит за счёт вызовов других микросервисов в рамках бакэнэко архитекторы. Мы экономим батарею пользователя. Но наши, достаточно дорогие, вызовы никуда не делись. Тем более если ноды с микросервисами могут быть географически распределены по разным датацентрам.
Не понял сообщения, можно как-то пояснить позицию?
источник

PD

Phil Delgyado in Архитектура ИТ-решений
Gennadiy Kruglov
Иными словами, какая-то часть клиентских данных ВСЕГДА является частью заказа. То есть, какая-то часть клиентских данных должна входить в состав агрегата  "Заказ", но этот агрегат ими не владеет, а только использует.

В случае с Bff мы "собираем" заказ в Bff, а не в микросервисе "Заказ" (условно).

Чтобы использовать, нужно либо подписаться и хранить копию (вариант 1), либо ходить за ними, когда нужно. Ходить можно по API или непосредственно за данными. Непосредственно за данными лучше ходить к представлению на чтение (вариант 2).
Мне кажется, что тут пошла терминологическая путаница.
@emacsway под "клиентом" подразумевал "пользователя сервиса", а ты - "клиентские данные".
источник

PD

Phil Delgyado in Архитектура ИТ-решений
Вообще, конечно, задача "а где и как собирать данные" сильно зависит от общей архитектуры, от общей идеологии создания сервисов, от оргструктуры и так далее. Общие решения - они, гм, не очень помогают.
источник

GK

Gennadiy Kruglov in Архитектура ИТ-решений
Phil Delgyado
Мне кажется, что тут пошла терминологическая путаница.
@emacsway под "клиентом" подразумевал "пользователя сервиса", а ты - "клиентские данные".
А как её избежать. Клиенту (мобилке/вебке) нужны в составе заказа данные Клиента (человека)

Как мне кажется, в контексте всё же можно разделить
источник

PD

Phil Delgyado in Архитектура ИТ-решений
Gennadiy Kruglov
А как её избежать. Клиенту (мобилке/вебке) нужны в составе заказа данные Клиента (человека)

Как мне кажется, в контексте всё же можно разделить
Я обычно говорю "фронтенду нужны данные Клиента" )
источник

GK

Gennadiy Kruglov in Архитектура ИТ-решений
Phil Delgyado
Я обычно говорю "фронтенду нужны данные Клиента" )
Когда мы говорим Bff, значит есть и другой потребитель сервиса (Клиент), а не только фронт. Иначе смысла в Bff нет и достаточно General purpose API
источник

GK

Gennadiy Kruglov in Архитектура ИТ-решений
Phil Delgyado
Вообще, конечно, задача "а где и как собирать данные" сильно зависит от общей архитектуры, от общей идеологии создания сервисов, от оргструктуры и так далее. Общие решения - они, гм, не очень помогают.
Это действительно так. Данные могут "собираться" по частям в процессе оркестации, например. Собирать при этом будет оркестратор.
источник

PD

Phil Delgyado in Архитектура ИТ-решений
Но вообще вопрос про "сервису нужны данные Клиента" сильно зависит от решения.
Я вот делю микросервисы внутри контекста на "доменные" (по сути хранилища с минимальной логикой) и сценарные (оркестрация изменений). Первые вообще друг про друга ничего не знают, вторым часто нужны данные из кучи сервисов, включая чужих.
Ну и bff (для разных потребителей, включая и API).
Но это я просто не люблю событийную модель внутри контекста.
источник

PD

Phil Delgyado in Архитектура ИТ-решений
Gennadiy Kruglov
Когда мы говорим Bff, значит есть и другой потребитель сервиса (Клиент), а не только фронт. Иначе смысла в Bff нет и достаточно General purpose API
Ну, иногда бывает ровно один потребитель и под него делаем bff - потому что именно под него, а не под произвольного потребителя (т.е. API точно не generic).
источник

GK

Gennadiy Kruglov in Архитектура ИТ-решений
Phil Delgyado
Ну, иногда бывает ровно один потребитель и под него делаем bff - потому что именно под него, а не под произвольного потребителя (т.е. API точно не generic).
Bff когда несколько потребителей разных, мначе это просто General purpose API. Почему? Потому что ВЕСЬ API нужен единственному клиенту.
источник

GK

Gennadiy Kruglov in Архитектура ИТ-решений
Phil Delgyado
Но вообще вопрос про "сервису нужны данные Клиента" сильно зависит от решения.
Я вот делю микросервисы внутри контекста на "доменные" (по сути хранилища с минимальной логикой) и сценарные (оркестрация изменений). Первые вообще друг про друга ничего не знают, вторым часто нужны данные из кучи сервисов, включая чужих.
Ну и bff (для разных потребителей, включая и API).
Но это я просто не люблю событийную модель внутри контекста.
Как мне показалось, мы конкретный пример рассматривали. Но в целом, согласен.
источник

PD

Phil Delgyado in Архитектура ИТ-решений
Gennadiy Kruglov
Bff когда несколько потребителей разных, мначе это просто General purpose API. Почему? Потому что ВЕСЬ API нужен единственному клиенту.
Хм. Для меня разница в другом. bff - когда я точно знаю потребителя API. А General Purpose API - когда я его вообще не знаю.
Так что может быть и BFF для единственного потребителя.
При проектировании разница очень заметна )
источник

GK

Gennadiy Kruglov in Архитектура ИТ-решений
Phil Delgyado
Хм. Для меня разница в другом. bff - когда я точно знаю потребителя API. А General Purpose API - когда я его вообще не знаю.
Так что может быть и BFF для единственного потребителя.
При проектировании разница очень заметна )
Кстати, может ты и прав. Но вообще-то все примеры связанные с Bff, как и интро в статьях, именно про "разделение" API под клиента.

Но скорее, ты всё же прав. Есть специфика у API для мобилки, например. То есть General purpose такое API вряд-ли будет.
источник

SB

Sergey Baranov in Архитектура ИТ-решений
Друзья, объединим усилия, кому это интересно? Отличие моей работы в том, что я хочу закрыть проблему интеграции практик и процессов в существующую организацию и, кажется, у меня в этом уже неплохой опыт.

Несколько лет назад ушел от рассмотрения практик в изоляции, так как обучить практике - это только 30% работы. Еще 30% работы это интегрировать ее с существующими и 30% дисциплина для преодоления инерции.
источник

SB

Sergey Baranov in Архитектура ИТ-решений
Неслабый gap образовался в области enteprise architecture в отношении микросервисов. В любой компании в том или ином виде существует архитектура этой компании. Порядка 3-х лет консолидировал данные из книг, научных источников, подкреплял собственными знаниями из практики, помогал нескольким компаниям построить agile enteprise architecture (отлично открывает путь к микросервисам).

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

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

Если есть желающие принять участие в разработки модели Agile Enterprise Architecture с уклоном в микросервисы, пишите в личку (@sergey486), объединим усилия.
источник