Просто не могу найти однозначного ответа онлайн.Я бы хотел использовать ES для своего проекта, но меня беспокоит то, что он асинхронный.Рассмотрим совместный блог-сайт (я делаю вещи для простоты, так как мой домен намного сложнее).Пользователи могут создавать сообщения в блоге и редактировать их.Вот и все, больше ничего.Итак, я только что создал запись в блоге с
createBlogEntryCommand = new CreateBlogEntryCommand(body, tags)
createBlogEntryCommand.execute()
С ES я бы сохранил BlogEntryCreatedEvent
в магазине ES, что-то вроде
eventStore.append({
"id": "1d11071c-33c6-4621-bb86-cafcc3ca23a6",
"body": "Lorem ipsum dolor sit amet....",
"tags": ["awesome-reading", "awesome-writing"],
})
Теперь у меня нетИдея, когда потребитель поднимет это событие и обработает.Конечно, у меня может быть эвристическая метрика, и я могу гарантировать, что это событие будет в некоторой степени обработано в X мс, но что, если, например, потребитель отключен для обслуживания?Как сделать запись в блоге доступной для автора сразу?
Конечно же, я могу опросить базу данных для идентификатора блога 1d11071c-33c6-4621-bb86-cafcc3ca23a6
(так как он предварительно сгенерирован, поэтому выпуск идентификаторов не является проблемой БД) и как только потребитель выберет событие и создаст материализованное представление в базе данных, сделайте его доступным для пользователя, но это единственный способ ?
PS Я смотрел много видео в Интернете на эту тему, я также прочитал тонну блогов, но любой источник, кажется, обходит это предостережение ES, не объясняя никаких подходов.Чаще всего нет, ответ, который я слышал, «это можно решить на уровне UI / UX».Поэтому, если есть хорошие книги / статьи / видео, в которых подробно обсуждается, как преодолеть ловушки ES, пожалуйста, поделитесь в комментариях.
ОБНОВЛЕНИЕ
Чтениеистория для синхронизации сразу ... Я действительно думал об этом, но очень быстро отказался от этой идеи.Рассматривая простое приложение todo, где пользователь может зарегистрироваться и создать список задач, я предполагаю иметь что-то вроде
UserRegistered
TodoCreated
TodoUpdated
TodoCompleted
TodoDeleted
TodoUnDeleted
При чтении событий из хранилища событий меня не интересуют элементы задач другого пользователя, но меня интересует тольков текущих задачах пользователя.Это означает наличие хранилища событий, таких как:
UserRegistered {name: Bob, id: 1}
UserRegistered {name: Alice, id: 2}
TodoCreated {id: 123, todo: Купить молоко, пользователь: 1}
TodoUpdated {id: 123, todo: Buy skimмолоко, пользователь: 1}
TodoCompleted {id: 123}
TodoCreated {id: 456, todo: Оплатить взносы, пользователь: 2}
TodoCompleted {id: 456}
TodoDeleted {id: 123}
TodoUnDeleted {id: 123}
TodoUpdated {id: 123, todo: Купить цельное молоко !, пользователь: 1}
Если бы мне потребовалось получить последнее состояние идентификатора задачи Боба 123 (купить молоко), мне нужно прочитать ВСЕ события, хотя они могут не иметь никакого отношения к списку предметов Боба.Так что я буду проходить через кучу событий задач, созданных другими пользователями, кроме Боба, чтобы только фильтровать и применять их.
Означает ли это, что мне потребуется специальный «канал» в моих событияххранить, чтобы содержать только действия Боба над элементами todo.Кроме того, что если кто-то еще сможет управлять элементами списка задач Боба?Что если у Алисы есть доступ к изменению задач Боба?Не сильно ли это увеличит схему хранения событий?