Есть ли четкое определение того, как следует применять CQRS и вопросы CQRS? - PullRequest
0 голосов
/ 21 ноября 2018

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

Я четко понимаю шаблон CQS.

Предположим, что мы внедряем микросервисы с CQRS без источника событий.

1) Первый вопрос: применяется ли шаблон CQRS только к клиентскому вводу / выводу?Это означает, что, надеюсь, я правильно понял, что, например, клиент обновляет данные с помощью контроллеров, которые записывают в базу данных A, но читают, запрашивая контроллеры, которые записывают в базу данных B (B в конечном итоге обновляется и может собирать информацию из нескольких моделей с использованием событий, отправленныхконтроллер А).

Или речь идет не о клиенте, а о чем-нибудь, например, о другом микросервисе для чтения / записи?И если последнее, то какова на самом деле граница, которая определяет, кто является читателем / писателем, который вызывает сегрегацию?Может быть, это связано с доменами в DDD?

Это важный вопрос, на мой взгляд, потому что без него CQRS является просто взаимозависимостью модели B, обновляемой моделью A, а не наоборот.,И почему бы это не распространить от модели B к модели C, например?

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

2) Как и в первом вопросе, почему некоторые ссылки говорят о событиях, как будто они являются командами CQRS?На мой взгляд, это усложняет CQRS, поскольку с технической точки зрения одним событием запроса мы можем запросить услугу «Эй, пожалуйста, дайте мне информацию X», и служба может ответить событием, содержащим полезную нагрузку, эффективно выполняя запрос.Это жесткое правило или просто пример, подтверждающий, что мы можем обновлять с помощью событий и выполнять запросы с использованием REST?

3) Что если в большинстве случаев я пишу в модель А и читаю измодель B, но в некоторых случаях я читал непосредственно из модели A?Я нарушаю CQRS?Что если мои запросы очень просты, должен ли я дублировать модель A в этой ситуации?

4) Что если, как указано в вопросе 1), я читаю из модели A для генерации событий, чтобы создать модель B,но потом мне нравится читать некоторую информацию из модели B, потому что она ценна, потому что она агрегируется, чтобы создать модель C?Я нарушаю CQRS?Что делает контроллер, который заполняет модель B, в этом случае, например, если он также генерирует события для заполнения модели C?В любом случае, это просто команда, потому что это не та часть, которая запрашивает, поэтому мы по-прежнему применяем CQRS?

Кроме того, что если мы читаем из модели A, чтобы генерировать события, чтобы создать модель B, но пока мы производимМодель B, мы излучаем события, для отправки клиентских уведомлений.Это все еще CQRS?

5) Когда нарушается CQRS?Если у меня есть контроллер, который читает из модели B, но также выдает сообщение, которое обновляет модель A, это так?

Наконец, если этот контроллер, например контроллер REST, читает из модели B и одновременно выдаетсообщение об обновлении модели A, но без какой-либо информации из того, что было прочитано из модели B (таким образом, операция - два в одном, но она не использует информацию из B для обновления A), это все еще CQRS?

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

Я буду очень признателен за ваше терпение, так как видно, что я все еще в замешательстве и что яучусь!

1 Ответ

0 голосов
/ 21 ноября 2018

Есть ли четкое определение того, как следует применять CQRS, и вопросы CQRS

Да, начните с Грег Янг .

CQRS - это просто создание двух объектов, где ранее был только один объект.Разделение происходит в зависимости от того, являются ли методы командой или запросом (то же самое определение, которое используется Мейером в разделении команд и запросов, команда - это любой метод, который изменяет состояние, а запрос - это любой метод, который возвращает значение).- Грег Янг 2010

Это «просто шаблон», рожденный из того факта, что представления данных, которые эффективны для запросов, часто не являются шаблонами, которые эффективны для отслеживания изменений,Например, использование СУБД для хранения бизнес-данных может быть нашим лучшим выбором для поддержания целостности данных, но для определенных типов запросов мы можем использовать репликацию этих данных в графической базе данных.

почему некоторые ссылки говорят о событиях так, как будто они являются командами CQRS

HandleEvent - это команда.CommandReceived это событие.Читателям (и авторам!) Очень легко спутать описываемые контексты.Все они являются «просто» сообщениями, семантика одного или другого действительно зависит от направления, в котором перемещается сообщение, относительно прав доступа к информации в сообщении.

Например, если я заполняю формуна сайте электронной коммерции и отправить;Является ли соответствующее сообщение событием OrderSubmitted?или это команда PlaceOrder?Любое написание может быть правильным, в зависимости от того, как вы решите смоделировать процесс заказа.

Что если в большинстве случаев я пишу в модель A и читаю из модели B, но в некоторыхслучаи, которые я читаю непосредственно из модели A?Я нарушаю CQRS?

Полиция CQRS не придет за тобой, если ты читаешь написание моделей.Во многих архитектурах бизнес-логика выполняется в компоненте без состояния и будет зависеть от чтения «текущего» состояния с какого-либо устройства хранения данных - другими словами, для поддержки записи часто требуется чтение.

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

Также: лошади для курсов.Вполне целесообразно ограничить использование CQRS теми случаями, когда вы можете извлечь из этого выгоду.Когда семантика GET / PUT отдельной модели работает, вы должны предпочесть, чтобы они разделяли модели для чтения и записи.

...