Наши прогнозы представлены в виде mongodb <...>
до того, как произошла эта принятая аппаратная ошибка
Скорее всего, описанная проблема касается не CQRS или EventSoucring, а самасвязанных с хранилищем проекций, о котором речь идет о MongoDB выше.
Вы пытаетесь выполнить потенциальную атомарную операцию без гарантий транзакций.Поскольку аппаратный сбой может быть вызван в произвольное время, база данных должна обеспечивать возможность отката неудачных атомарных операций в текущей транзакции.
Лучший выбор - собственные транзакции MongoDB, которые доступны с версии 4.0 - https://docs.mongodb.com/manual/core/transactions/ -и ваш код будет выглядеть так:
session.startTransaction( … );
try {
const lastNo = await eventsCollection.findOne( ... )
await eventsCollection.insertOne( …, lastNo +1 )
session.commitTransaction()
} catch (error) {
session.abortTransaction()
}
Если вам нужно использовать более старые версии MongoDB, транзакции все еще можно использовать.Но вместо использования встроенного оператора вы должны вручную записать журнал транзакций, а после повторного подключения к базе данных выполнить мониторинг прерванных транзакций и отменить их вручную через журнал.