CQRS с устаревшими системами

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

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

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

До сих пор я рассматривал следующее:

  1. Создайте представления в базе данных для моделей чтения, которые читают все таблицы, старые и новые
  2. Добавьте триггеры в существующие таблицы для обновления новых таблиц модели чтения.
  3. Добавьте некоторый код в базу данных (CLR Stored proc/etc [sql server]), чтобы обновить внешнее хранилище данных для моделей чтения.
  4. Отказаться от надежды

Каково общее мнение о том, как подходить к этому? Глупо ли думать, что я могу навести порядок в устаревшей системе, не переписав все полностью с нуля?


person reallyJim    schedule 19.06.2012    source источник
comment
Пожалуйста, не забудьте отметить ответ на вопрос, когда вы удовлетворены   -  person Brad Irby    schedule 08.06.2018


Ответы (3)


Я использовал вариант № 1 с успехом. Создание представлений для деморализации данных для создания модели чтения является жизнеспособным вариантом в зависимости от сложности базы данных для записи. Это означает, что если это относительно прямое соединение, понятное большинству разработчиков, я бы внимательно посмотрел, подходит ли оно для вас. Я был бы осторожен со слишком большой сложностью в этих представлениях.

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

person Derek Comartin    schedule 24.12.2014

Я когда-то был в похожей ситуации, следующие шаги были такими, как я это сделал:

Чтобы улучшить унаследованную систему и добиться более чистой кодовой базы, важно взять на себя ответственность за написание. Но не будьте слишком амбициозны, так как это может привести к изменению интерфейса/контракта, что сделает окончательное развертывание рискованным.

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

  2. Некоторые записи являются прямыми обновлениями SQL, но не под вашим контролем.
    Спросите ответственную группу, могут ли они перейти на ваш новый интерфейс/контракт?
    Если нет, см. шаг 3.

  3. Спросите, могут ли они допустить возможную согласованность и готовы ли заменить обновления sql процедурами базы данных?
    Если да, поместите все обновления sql в процедуры и запланируйте развертывание и см. шаг 4.
    Если нет, возможно, вы следует включить их в ваш рефакторинг.

  4. Измените процедуру, замените обновления sql на вставку событий. И разработайте бэкэнд-задачу для переноса событий и их публикации. Сделайте так, чтобы ваше новое приложение подписывалось на эти события, чтобы отправлять команды вашим обработчикам команд.

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

  6. Перейдите к следующей части устаревшей системы.

person Yugang Zhou    schedule 24.12.2014

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

Я добился успеха с решением, которое менее навязчиво, чем решение @Hippoom, но более отзывчиво, чем решение @Derek. Если у вас есть доступ к устаревшей системе и вы можете вносить незначительные изменения в код, вы можете добавить асинхронную запись в очередь для генерации события в системе очередей (RabbitMQ, Kafka или любой другой) в репозиториях устаревшей системы или везде, где данные сохраняются. Выполнение этих асинхронных операций записи не должно приводить к значительным потерям производительности, и в случае сбоя записи очереди это не повлияет на устаревшую систему. Это изменение также довольно легко получить через QA.

Затем напишите часть, управляемую событиями, которая обновит ваши модели чтения. На этапе обновления устаревшей системы (что может занять некоторое время) или если у вас есть доступ только к некоторым устаревшим системам, которые выполняют запись в эти базы данных, у вас может быть небольшая утилита, которая помещает новое событие «UpdateViewModel» в очередь каждый раз. пара минут. Тогда вы будете получать своевременные события, когда устаревшие системы сохраняют что-то важное, но также покрываются для систем, которые вы не можете обновить.

person Brad Irby    schedule 05.06.2018
comment
Возможно, вы пропустили мой комментарий о бесчисленном количестве приложений, которые обновляют общие базы данных. В целом я согласен с использованием асинхронного решения для обмена сообщениями для решения этой проблемы в одном приложении, но на данный момент система состоит из такого количества приложений, что обновить их все было бы геркулесовой задачей — если мы даже выяснил, какие из них на самом деле касаются каких данных... - person reallyJim; 31.07.2018