Я рассуждаю об источниках событий и часто прихожу к проблеме курицы и яйца. Был бы признателен за подсказки, как это обосновать.
Если я выполняю всю обработку, связанную с вводом-выводом, асинхронно (т. е. записываю в журнал событий), то как мне обрабатывать, а иногда даже обнаруживать сбои?
Я использую Akka Actors, поэтому обработка выполняется последовательно для каждого события/сообщения. В настоящее время у меня нет базы данных, вместо этого я буду сохранять все события в журнале событий, а затем сохранять агрегированное состояние всех событий в модели, хранящейся в памяти. Запросы все против этой модели, можете считать это кешем.
Пример
Создание нового пользователя:
- Подтвердить, что пользователь не существует в модели
- Сохранить событие в журнале
- Обновить модель (в памяти)
Если шаг 3 прерывается, я все еще сохраняю свое событие, поэтому я могу воспроизвести его позже. Если шаг 2 сломается, я тоже справлюсь с этим изящно.
Это нормально, но поскольку шаг 2 связан с вводом-выводом, я решил, что должен выполнять ввод-вывод в отдельном действующем субъекте, чтобы освободить первый действующий элемент для запросов:
Обновление пользователя при разрешении запросов (A0 = актор внешнего интерфейса/графического интерфейса, A1 = актор процессора, A2 = актор IO, E = шина событий).
- (A0->E->A1) Событие публикуется для обновления пользователя 'U1'. Подтвердите, что пользователь «U1» существует в модели
- (A1->A2) Сохранение события в журнале (отдельное действующее лицо)
- (A0->E->A1->A0) Запрос для профиля пользователя 'U1'
- (A2->A1) Событие теперь сохраняется, продолжайте обновлять модель
- (A0->E->A1->A0) Запрос профиля пользователя 'U1' (теперь возвращает свежие данные)
Это привлекательно, поскольку запросы могут обрабатываться, пока ввод-вывод происходит в своем собственном темпе.
Но теперь я могу создавать себе всевозможные проблемы, когда две несовместимые команды (удалить, а затем обновить) могут сохраняться в журнале событий и вылетать у меня при повторном воспроизведении позже, поскольку я выполняю проверку перед сохранением события. а затем обновить модель.
Моя цель состоит в том, чтобы иметь простые рассуждения вокруг моей модели (поскольку Актер обрабатывает сообщения последовательно с одним потоком), но не ждать обновлений, связанных с вводом-выводом, при выполнении запросов. У меня такое чувство, что я моделирую базу данных, которая сама по себе может быть проблемой.
Если что-то непонятно, напишите комментарий.