2015-02-01 5 views
5

У меня есть новый поток ES, в котором уже есть полмиллиона событий (пока нет снимков ... Я знаю, я туда добираюсь) и простого клиента, который atm только добавляет (еще больше) событий.Получить версию NEventStore head

NEventStore.OpenStream(int.MinValue, int.MaxValue) занимает очень много времени, чтобы открыть поток изначально; после чего я сохраняю последнюю ревизию и с этого момента добавлю только NEventStore.OpenStream(lastRevision, int.MaxValue). Проблема только при первоначальном запуске.

Есть ли механизм в пределах NEventStore либо просто добавлять без открытия, либо определять головную ревизию, не открывая весь поток, поэтому я могу открыть ее из последней версии и добавить. Конечно, я мог бы также перейти непосредственно к базе данных и запросам, но это зависит от зависимости, которую я чувствую, что мне не нужно.

ответ

3

Вы уже упоминали о возможном решении: снимки.

В этом примере открывается поток из последнего моментального снимка и добавляется новый моментальный снимок после совершения событий.

// Get the latest snapshot 
var latestSnapshot = _eventStore.Advanced.GetSnapshot(streamId, int.MaxValue);    

// Open the stream from the snapshot if there is one, otherwise open the stream as normal 
using (var stream = latestSnapshot == null ? 
    _eventStore.OpenStream(streamId) : 
    _eventStore.OpenStream(latestSnapshot, int.MaxValue)) 
{ 
    // Add events and commit 
    stream.Add(new EventMessage()); 
    stream.CommitChanges(Guid.NewGuid()); 

    // Add a new snapshot (with no payload) 
    _eventStore.Advanced.AddSnapshot(
     new Snapshot(streamId, stream.StreamRevision, string.Empty)); 
}  

Возможно, нет необходимости добавлять новые снимки часто. Это просто пример, показывающий, как работают снимки.

+0

Спасибо, я знал, что создание моментального снимка в конце потока позволит мне загружать из моментального снимка вперед, но эффективнее ли получать GetSnapshot, получая последний снимок, если их много? Я надеялся, что может быть простой способ получить последнюю версию из потока напрямую. – 9swampy

+0

Хорошо смотря на определение GetSnapshot, поскольку оно извлекает последний снимок до [int.MaxValue]. Я ожидаю, что он оптимизирован, поэтому я добавил код в процессе, чтобы добавить моментальный снимок каждые 10000 ревизий. Вернется и примет, если это сработает, и ничего более прямого не предлагается ... – 9swampy

+1

Я понимаю, что это не идеальное решение для вашего сценария, но я не думаю, что есть лучший способ. AFAIK также нет способа удалить старые снимки. – dillenmeister