Я работаю над концепцией архитектуры CQRS/ES, и мы оцениваем RavenDB как потенциальный хранилище документов для некоторых моделей чтения.Query RavenDB index внутри сеанса - сеанс не является единицей работы?
Я использую асинхронный сеанс IAsyncDocumentSession
по двум причинам:
- Проекция трубопровод модель считывания полностью асинхронна и оптимизирован для чередования обработки
- Я ожидал, что наличие единицы работы с кэшированием в памяти должно повысить производительность
Однако, когда я запускаю запрос (с индексом), я не получаю документы я добавил к текущей сессии, даже при указании WaitForNonStaleResultsAsOfLastWrite
. Это означает, что я не могу обновить эти документы и в итоге создать новые документы.
Я использую репозиторий для доступа RavenDB:
public async Task<ItemDistribution> FindAsync(Guid warehouse, Guid location, Guid item)
{
var list = await this.Session
.Query<ItemDistribution, ItemDistribution_WarehouseLocationItem>()
.Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
.Where(x => x.Warehouse == warehouse && x.Location == location && x.Item == item)
.ToListAsync();
// split for debugging purposes
return list.SingleOrDefault();
}
После того, как я называю SaveChangesAsync()
, это приводит к тому, документы, которые будут добавлены в магазин и на следующий запрос затем находит сохраненные документы.
Это, для меня, указывает, что сеанс RavenDB не действует как единица работы при запросе?
Я не хотел добавлять ключ (склад, местоположение, элемент) к идентификатору документа, потому что документация препятствует этому.
Какие еще существуют варианты для быстрого создания или обновления документов в моих проекциях?
Update
Это похоже на работу, если отслеживать документы в моей собственной единицы работы (т.е. словарь) и только ударил сессию/DB, когда я не нашел его. Я не уверен, что это хорошее решение. Однако производительность увеличилась до нескольких тысяч (или десятков тысяч) событий в секунду.
Проще говоря, проблема заключается в том, что любые документы, которые еще не сохранены, но были добавлены в единицу работы, не найдены при выдаче запроса. То есть Я назвал 'Store (document)', но не 'SaveChanges', и я ранее не загружал документ, потому что это новый документ. – urbanhusky