Лагом настойчивое чтение сторона и эволюция модели - PullRequest
0 голосов
/ 16 октября 2018

Чтобы выучить lagom, я создал простое приложение с несколькими простыми постоянными сущностями и постоянной стороной чтения (согласно официальной документации, использующей cassandra)

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

Предполагается, что у меня есть объект с именем Item, с ID и name, и сторона чтения создает таблицукак CREATE TABLE IF NOT EXISTS items (id TEXT, name TEXT, PRIMARY KEY (id))

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

Я вижу несколько подходов для достижения (возможно) этого:

  1. использование эволюции моделитакой инструмент, как liquibase или play evolutions для изменения таблиц чтения.
  2. каким-то образом включает update table операторы в createTables, которые переносят модель
  3. , создают дополнительные таблицы, содержащие дополнительную информацию, и сохраняют старые таблицы без изменений

Какой подход будет наиболее подходящим?Есть что-то лучше?

Ответы [ 2 ]

0 голосов
/ 25 июля 2019

Создание новой таблицы и удаление старой таблицы тоже вариант ИМХО.Это просто, изменив команду «создать таблицу» («создать таблицу mytable_v2 ...» и «удалить таблицу mytable ...»), изменив имя смещения и изменив обработчики событий.

override def buildHandler( ): ReadSideProcessor.ReadSideHandler[MyEvent] = {
      readSide.builder[MyEvent]("myOffset") // change it to "myOffset_v2"
      ...
}

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

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

0 голосов
/ 16 октября 2018

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

Обычно ваши подписчики подписываются на события API, которые не должны развиваться.Ваши внутренние события (или подразумеваемые события) будут , вероятно, должны развиваться;из-за этого должно быть преобразование из impl в API.

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

...