Ожидание новой записи в прочитанной модели, созданной проекцией в PROOPH

Я использую prooph ( https://github.com/prooph), поэтому у меня есть модель записи, где я храню события, как показано ниже (таблица агрегирования):

Напишите модель

когда я запускаю проекцию в фоновом режиме, используя команду:

php bin/console event-store:projection:run card_projection

Я прочитал модель, как показано ниже:

Читать модель

Перед моим фоновым приложением у меня есть API отдыха, где я создаю событие:

CardWasAdded

через URL:

POST /cards

и я получаю код 201.

После этого я обновляю свой список через URL:

GET /cards

Проблема в том, что иногда это новое событие не обрабатывается проекцией. Итак, вопрос:

Как решить эту проблему?

  1. Стоит ли ждать 2 секунды или какое-то время?(Безобразный хак для меня).
  2. Должен ли я обрабатывать событие после вставки - не использовать процесс проецирования в фоновом режиме?

2 ответа

Мой ответ не является конкретным, но вот некоторые стратегии, которые вы можете использовать в любой системе CQRS:

  1. Просто примите тот факт, что модель чтения не является последовательной (ничего не делайте). Пример - когда я публикую что-то в Твиттере, я не могу сразу увидеть свое сообщение в потоке, и это нормально. Это появится там в конце концов.
  2. Оптимистичное обновление пользовательского интерфейса. Просто обновите пользовательский интерфейс, как будто ваша команда прошла. Если нет - ничего страшного. Пример - как-то в твиттере. Вам не нужно ждать подтверждения. Если что-то вроде не удалось - его статус будет при следующем обновлении чтения модели.
  3. Подождите в конечной точке API. Был вызван ваш API, вы вводите команду и ищите конкретное обновление модели чтения. Сбой по таймауту.
  4. Подождите на уровне пользовательского интерфейса. Вы отправляете команду и отображаете некоторый элемент пользовательского интерфейса "Ожидание", пока ваш запрос не вернет то, что вы искали, или произойдет сбой по таймауту.

В стратегии 3 и 4 вы можете использовать какую-то серверную сигнализацию - сокеты или что-то вроде этого. Ваша прочитанная модель может подтвердить, что она обновлена.

Спасибо, Роман, за ответ.

Наконец я принял тот факт, что чтение модели имеет задержку.

В моем остальных API, когда я POST новый ресурс, я возвращаю 201 и JSON с новым созданным Id и так далее. Мое фронтальное приложение, основанное на ответе от нового ресурса POST (POST / карта), добавляет новую запись в таблицу данных в виде новой строки со значком "NEW".

Когда пользователь обновляет список, чтение модели готово (поскольку создание новой записи занимает менее 1 секунды).

В конце нет никакой разницы для пользователя, является ли запись от

POST / карты

или же

GET / карты

так что пользовательский опыт в порядке.

Другие вопросы по тегам