CQRS & ElasticSearch - использование ElasticSearch для построения модели чтения - PullRequest
3 голосов
/ 13 декабря 2010

Кто-нибудь использует ElasticSearch для построения модели чтения в подходе CQRS?У меня есть несколько вопросов, связанных с таким решением:

  1. Где вы храните события вашего домена?В базе данных JDBC?В ElasticSearch?
  2. Создаете ли вы индексы с помощью обработчиков событий, которые обрабатывают события домена или используют функциональность ElasticSearch River?
  3. Как вы справляетесь с полным перестроением модели представления - например, в случае, если представление повреждено?Обрабатываете ли вы все события для повторного просмотра?

1 Ответ

1 голос
/ 20 марта 2011

Где находится авторитетный репозиторий для вашего доменного события - это деталь реализации.Например, вы можете хранить сериализованные версии на S3 или CouchDB или любом другом количестве реализаций хранилища.Самым простым, если вы только начинаете, является реляционная база данных.

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

Если модель представления когда-либо повреждена или, возможно, у вас есть ошибка в обработчике модели представления, есть несколько простых шагов, которые нужно выполнить после исправления ошибки:

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

  2. Чтение всех событий из хранилища событий.По мере получения каждого события (это можно сделать с помощью простого запроса к БД), запускайте каждое сообщение через соответствующий обработчик сообщений.Убедитесь, что вы отслеживаете последние 10 000 (или около того) идентификаторов для всех обработанных сообщений.

  3. Теперь снова подключитесь к своим очередям и начните обработку в обычном режиме.Если идентификатор сообщения был замечен, отбросьте сообщение.В противном случае обработайте его как обычно.

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

Другой метод, который тесно связан, но включает отслеживание всех идентификаторов сообщений, можно найти здесь: http://blog.jonathanoliver.com/2011/03/removing-2pc-two-phase-commit.html

...