DDD, CQRS / ES и MicroServices Следует ли принимать решения по представлениям или совокупностям Microservice? - PullRequest
0 голосов
/ 20 мая 2018

Итак, я объясню проблему с помощью примера, так как он делает все более конкретным и, надеюсь, уменьшит двусмысленность.

Архитектура довольно проста

1 MicroService <=> 1 Aggregate <=> Транзакционная граница

Каждый микросервис будет использовать дизайн CQRS / ESшаблон, который подразумевает

  • Каждый микросервис будет иметь свой собственный Агрегат, отображающий область реальной проблемы
  • Состояние агрегата будет восстановлено из хранилища событий
  • Каждое событие будет означать изменение состояния в агрегате и будет передаваться любой службе, заинтересованной в изменении, через посредник сообщений
  • Каждый микросервис будет транзакционным в своем собственном домене
  • Каждый микросервисв конечном итоге будет соответствовать другим доменам
  • Каждый микросервис будет создавать свои собственные модели представлений, исходя из событий, излучаемых другими микросервисами

Так что в примере, скажем, у нас есть банковская система

  • current-account микросервис отвечает за отображение текущего счета клиента ... Withdrawal, Deposего
  • rewards микросервис будет отвечать за инвентаризацию и инвентаризацию любых вознаграждений, обслуживаемых банком
  • air-miles микросервис будет отвечать за мониторинг всех транзакций, поступающих с current-account и при этом награждает Клиента наградами от нашего микро-сервиса вознаграждений

Так что проблема в том, должен ли микросервис air-miles принимать решения на основе своей собственной модели представления, которая обновляется ссобытия, происходящие от current-account, и, аналогично, от выбора вознаграждения, которое он должен вручить Заказчику?

Недостатки принятия решений по моделям локального представления;

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

Преимущества принятия решенийИон на моделях локального просмотра;

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

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

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

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Итак, проблема в том, должен ли микросервис air-miles принимать решения на основе своей собственной модели представления, которая обновляется на основе событий, поступающих с текущего счета, и аналогичным образом, на основе выбора вознаграждения, которое он должен датьЗаказчик?

Да.Фактически, вы должны пересмотреть свою архитектуру и даже создать больше микросервисов.Я имею в виду, что, будучи архитектурой, управляемой событиями (также основанной на событиях), ваши микросервисы имеют две обязанности: они должны поддерживать две разные модели: модель записи и модель чтения.

Таким образом, для каждого Агрегата должен быть микросервис, который поддерживает только модель записи, то есть обрабатывает только Команды, без построения также модели чтения.

Затем для каждого чтения / запросаВ случае использования у вас должен быть микросервис, который создает модель чтения perfect .Это необходимо, если вам нужно поддерживать агрегированный микросервис в чистоте (как следует), потому что в общем случае для моделей чтения требуются данные из нескольких агрегированных типов / ограниченных контекстов.Считанные модели могут пересекать ограниченные контекстные границы, агрегаты - нет.Итак, вы видите, у вас действительно нет выбора, если вам нужно полностью соблюдать DDD.

Некоторые говорят, что доменные события должны быть скрытыми, только локальными по отношению к собственному микросервису.Я не согласен.В управляемой событиями архитектуре доменные события являются гражданами первого класса, им разрешено достигать других микросервисов.Это дает другим микросервисам возможность построить свою собственную интерпретацию состояния системы.В противном случае испускающая микросервис будет иметь невозможную дополнительную ответственность / задачу построения состояния, которое должно соответствовать всем возможным потребностям, которые когда-либо понадобятся всем микросервисам (!);то есть, может быть, микросервисам захочется найти удаленных удаленных объектов title, как он может это сделать, если испускающий микросервис хранит только список не удаленных, но все же объектов?Вы можете сказать: но тогда он сохранит все сущности, удаленные или нет.Но, возможно, кому-то нужна дата, когда объект был удален;Вы можете сказать: но тогда я сохраняю и deletedDate.Вы видите, что вы делаете?Вы нарушаете принцип Open / Closed.Каждый раз, когда вы создаете микросервис, вам нужно модифицировать испускающий микросервис.

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

Да, будет некоторое дублирование кода.И да, хотя я сказал, что у вас нет выбора, у вас есть.Чтобы уменьшить дублирование кода за счет более низкой устойчивости, у вас могут быть некоторые модели чтения Canonical, которые строят нормальное плоское состояние, и другие микросервисы могут запросить это.В большинстве случаев это опасно, поскольку нарушает концепцию плавательных дорожек.Если микросервисы Canonical выйдут из строя, отключите все зависимые микросервисы.Микросервисы Canonical лучше всего работают для CRUD-подобного ограниченного контекста.

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

0 голосов
/ 21 мая 2018

Таким образом, проблема заключается в том, должен ли микросервис air-miles принимать решения на основе своей собственной модели представления, которая обновляется на основе событий, поступающих с текущего счета, и аналогичным образом, на основе выбора вознаграждения, которое он должен выдатьКлиенту?

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

Так что если air-miles нужна информация от current-accountон должен смотреть на локальную копию представления, вычисляемого службой current-account.

Основная идея заключается в следующем: предполагается, что микроуслуги изолированы друг от друга;у вас должна быть возможность перепроектировать и развернуть один, не оказывая влияния на другие.

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

Должно ли изменение в current-account потребовать соответствующего изменения в службе air-miles?Если да, можем ли мы действительно утверждать, что эти сервисы изолированы друг от друга?

Преимущества принятия решения по моделям локального просмотра

Мне не особенно нравятся эти«преимущество»;во-первых, в них преобладает ось производительности (помните, что правило оптимизации производительности second - «еще нет»).И, во-вторых, они предполагают, что границы услуг правильно нарисованы;возможно, проблема с производительностью является доказательством того, что разделение обязанностей требует пересмотра.

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