2010-07-13 4 views
3

Может ли кто-нибудь, пожалуйста, дать мне некоторое направление в отношении различных способов: синхронизировать базы данных Write and Read?CQRS: Синхронизация баз данных для записи и чтения

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

+0

Можете ли вы объяснить, как это относится к DDD? –

+0

Извините! Мой плохой ... Я должен был поставить CQRS там ... Спасибо за упоминание чувака! – Mosh

ответ

6

Как правило, в CQRS ДБ записи используется для хранения данных для переходных длительные процессы (саги). Если вы синхронизируете БД чтения и записи (я предполагаю, что вы имеете в виду оба пути), вы можете делать что-то неправильно.

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

Когда окончательное утверждение будет получено, служба будет получать информацию о клиенте из БД записи, завершить процесс регистрации и записать его в считываемый БД. В это время временная информация о клиенте в БД записи выполнила свою работу и может быть удалена из БД записи. Обратите внимание, что нет никакой двусторонней синхронизации.

Для упрощения процесса, такого как смена имени клиента, изменение может быть сразу записано в чтение. Запись в БД записи не требуется, поскольку в этом случае нет временных данных.

1

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

Если вы используете CQRS, то, вероятно, вы будете иметь хранилище, которое выглядит несколько, как этот

public interface IRepository<T> where T : AggregateRoot, new() 
    { 
     void Save(AggregateRoot aggregate, int expectedVersion); 
     T GetById(Guid id); 
     T GetById(Guid id, int version); 
    } 

Надеюсь, это поможет Cheers

0

Модель запроса не обязательно должна быть последовательной. Она должна быть в конечном итоге последовательной. Модель запроса также является моделью просмотра, т. Е. Таблицы уже соединены согласно требованию пользовательского интерфейса. Таким образом, вы можете использовать даже кеш в памяти или как Redis.
Командная часть - это объекты команд, которые содержат всю необходимую информацию для обновления базы данных. Эти объекты могут заполнять очередь сообщений. Объекты команд обрабатываются командным процессором, который транзакционно обновляет кеш запросов и базу данных записи. База данных записи может быть RDBMS .. но, как очевидно, должна быть оптимизирована запись, как MongoDB.
Вы также можете обновить базу данных чтения через систему обмена сообщениями.
Некоторые хорошие системы обмена сообщениями для этой цели - RabbitMQ и 0MQ.

Смежные вопросы