Как выбрать, какие события будут отправляться пользователю в периодически подключаемой системе с помощью CQRS с источником событий?

Я создаю веб-приложение, в котором пользователи могут редактировать заметки и делиться ими. Пользователи должны быть подключены к заметкам с ролями (владелец, чтение, чтение-запись). Это периодически подключаемая система, поэтому я решил выполнять синхронизацию с использованием CQRS и источников событий. После презентации Грега Янга [36:20 - 38:40], поток будет следующим:

  1. Клиент вносит изменения в автономном режиме.
  2. Клиент подключается к Интернету.
  3. Функция «хранить и пересылать» отправляет события, произошедшие, пока клиент был в автономном режиме.
  4. Клиент сравнивает локальные события с полученными событиями и выполняет слияние, решая, какие команды оставить. Затем обновляет локальную модель просмотра.
  5. Клиент отправляет на сервер сохраненные команды (созданные в автономном режиме).
  6. Сервер выполняет команды и генерирует события, которые хранятся в хранилище событий.
  7. "store and forward" хранит события, которые интересуют каждого пользователя, до тех пор, пока он не вернется в сеть.

Возникает вопрос: Как «хранилище и предисловие» решают, какие события следует отправлять каждому пользователю?

Очевидно, что отправка всех событий поставит под угрозу безопасность других пользователей.


person AndrouR    schedule 27.10.2019    source источник


Ответы (1)


Поскольку ваш клиент знает, какие агрегаты он отображает, он может просто сказать бэкэнду: «Эй, есть ли события для aggregateIds [...] с [timestamp]?».

Вот как структура reSolve сохраняет пользовательский интерфейс реактивным - клиент подписывается на события для определенного aggregateId и получает их в реальном время через веб-сокеты.

Таким образом, один ответ на ваш вопрос может быть таким: «позволить пользователю запрашивать события (aggregateIds), которые его интересуют».

person Roman Eremin    schedule 30.10.2019