Event Sourcing и синхронные чтения.Является ли это возможным? - PullRequest
0 голосов
/ 25 января 2019

Просто не могу найти однозначного ответа онлайн.Я бы хотел использовать 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.Кроме того, что если кто-то еще сможет управлять элементами списка задач Боба?Что если у Алисы есть доступ к изменению задач Боба?Не сильно ли это увеличит схему хранения событий?

1 Ответ

0 голосов
/ 25 января 2019

это единственный способ?

Нет.

Нет ничего неправильно при чтении истории событий из хранилища событийи затем использовать эти события для вычисления вашего представления по требованию.

View v = View.from(events);

Означает ли это, что мне нужно будет иметь специальный «канал» в моем хранилище событий, который будет содержать только действия Боба по заданиюПредметы.Кроме того, что если кто-то еще сможет управлять элементами списка задач Боба?Что если у Алисы есть доступ к изменению задач Боба?Разве это не сильно увеличит схему хранения событий?

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

Например, если вы использовали СУБД в качестве хранилища, у вас может быть один столбец большого двоичного объекта для всех ваших данных события, а затем несколько дополнительных столбцов для хранения битов метаданных, которые полезны дляизвлечение.

Правила доступа (которые могут вносить изменения) представляют собой отдельную проблему из контекста самих событий (которые являются событиями).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...