Управление версиями контента — автоматическое сохранение несовместимо с источниками событий

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

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


person inf3rno    schedule 28.04.2017    source источник
comment
Работают ли одновременные пользователи над одним черновиком?   -  person Constantin Galbenu    schedule 28.04.2017
comment
Я имею в виду, что происходит, когда два пользователя (автоматически) сохраняют один и тот же черновик одновременно?   -  person Constantin Galbenu    schedule 28.04.2017
comment
@ConstantinGALBENU Нет, только владелец может изменить черновик. Если вы зафиксируете черновик, вы получите новую версию статьи. Другие авторы смогут начать с этой версии и создать на ее основе новый черновик. Или они могут объединить версии вручную с помощью инструмента сравнения.   -  person inf3rno    schedule 28.04.2017
comment
Вы должны оставить редактирование/автоматическое сохранение вне источника событий и использовать простой CRUD.   -  person Constantin Galbenu    schedule 28.04.2017
comment
@ConstantinGALBENU Черновики должны синхронизироваться между компьютерами автора. Таким образом, они должны иметь возможность использовать несколько разных компьютеров (не одновременно) для редактирования статей. Как я могу решить эту проблему, не сохраняя черновики на сервере? И если я сохраню их на сервере, я сохраню их и в хранилище событий. Наверное...   -  person inf3rno    schedule 28.04.2017
comment
Не обязательно. Вы можете использовать CRUD и генерировать событие предметной области каждый раз, когда обновляется черновик, который следует передавать другим клиентам, чтобы они опрашивали новый черновик. Событие должно быть примерно таким: DraftUpdated(id, timestamp); это событие предметной области не должно храниться в хранилище событий.   -  person Constantin Galbenu    schedule 28.04.2017
comment
Пожалуйста, скажите мне, если вам нужна дополнительная информация   -  person Constantin Galbenu    schedule 28.04.2017
comment
@ConstantinGALBENU Спасибо! Забавно, я не знал, что могут быть доменные события, которые не сохраняются в хранилище. :D   -  person inf3rno    schedule 28.04.2017
comment
Эти события широко используются в архитектурах CQRS (без ES).   -  person Constantin Galbenu    schedule 28.04.2017


Ответы (1)


Должно быть два отдельных связанных контекста: Editing bounded context и Content bounded context (имена могут отличаться, адаптируйте их к своему домену).

В Editing BC вы не должны использовать Event sourcing в качестве механизма сохранения черновиков. Вместо этого вы можете использовать простые объекты CRUD и публиковать событие инфраструктуры (например, DraftUpdated(id, timestamp)) каждый раз, когда Draft сохраняется (т. е. автосохранение). Затем прослушиватель событий должен перенаправить это событие подключенным клиентам, чтобы они обновили свою версию черновика. Это событие инфраструктуры не должно сохраняться, это просто временное событие. Вы можете использовать любой доступный транспортный механизм, например SSE или RabbitMQ.

person Constantin Galbenu    schedule 28.04.2017
comment
Возможно, я нашел другой способ. Я сохраняю событие DraftUpdated во временном хранилище, которое через некоторое время сохраняет событие в хранилище событий, например. 10 мин. Каждый раз, когда автосохранение обновляет черновик, событие, сохраненное во временном хранилище, переопределяется, а таймер сбрасывается. Таким образом, черновики сохраняются не так часто, я могу синхронизировать черновики с другими клиентами, а хранилище событий по-прежнему можно использовать. Мне просто нужно попробовать это на практике. - person inf3rno; 14.10.2017