В настоящее время я пишу распределенное приложение с микросервисной архитектурой.
Для этого я применяю шаблон CQRS и источник событий с помощью axon framework .Таким образом, данные в конечном итоге непротиворечивы.
И сторона записи, и сторона чтения доступны через HTTP;ОТДЫХАЕТ конкретно.
Первоначальная проблема:
После обновления / создания объекта пользователь [1] должен иметь возможность видеть результаты.Поскольку события обрабатываются асинхронно, клиент / пользовательский интерфейс не знает, когда сущность действительно обновлена (или создана).Поэтому, когда клиент выбирает данные после отправки запроса на обновление, но до обработки события, неизмененные данные возвращаются.Поэтому пользователь может подумать, что приложение сломано и / или отправляет новый запрос.
Попытка решения:
При поиске решения проблемы чтения после записи я наткнулся на эту запись в блоге .
Предлагаетсявернуть новую версию объекта в ответе на запись.Затем клиент может запросить данные с ожидаемой версией объекта (как заголовок Expect ).Если фактическая версия равна или превышает ожидаемую версию, данные возвращаются.Или же возвращается пустой ответ с заголовком Retry-After .
Проблема:
Когда клиент отправляет запрос UpdateFooна стороне записи приложение отправляет соответствующую команду UpdateFooCommand через CommandGateway.Команда обрабатывается агрегатом сущностей, который публикует FooUpdatedEvent.Сторона чтения получает это событие и обновляет свое представление объекта, к которому можно получить доступ через интерфейс REST стороны чтения.
Это контролируется платформой аксона.Обработчики отмечены @CommandHandler
и @EventSourcingHandler
соответственно.
Теперь: как я могу получить доступ к новому номеру версии затронутого объекта в CommandHandler, чтобы этот номер можно было вернуть в ответе на обновление?
Заранее спасибо
[1] Не только пользователям.Могут быть и другие клиенты.