2017-01-04 5 views
1

Я создаю нераспределенную ленту изменений, которую я хочу возобновить, например. опрос для новых изменений каждые X секунд. Переменная контрольной точки ниже содержит последний ответ продолжения ответа.DocumentDb, оптимизирующий возобновление подачи без разбиения на разделы

private string checkpoint; 

    private async Task ReadEvents() 
    { 
      FeedResponse<dynamic> feedResponse; 
      do 
      { 
       feedResponse = await client.ReadDocumentFeedAsync(commitsLink, new FeedOptions 
       { 
        MaxItemCount = this.subscriptionOptions.MaxItemCount, 
        RequestContinuation = checkpoint 
       }); 

       if (feedResponse.ResponseContinuation != null) 
       { 
        checkpoint = feedResponse.ResponseContinuation; 
       } 

       // Code to process docs goes here... 

      } while (feedResponse.ResponseContinuation != null); 
    } 

Обратите внимание на использование блока «if» вокруг контрольной точки. Это делается, потому что, если я оставлю это, responseContinuation получает значение null, что в основном перезапустит цикл опроса, поскольку установка продолжения запроса на нуль приведет к 1-му набору документов в фиде изменений.

Однако нижняя граница каждого цикла опроса будет воспроизводить предыдущий набор документов, а не только любые дополнительные изменения. Есть ли что-то, что я могу сделать, чтобы оптимизировать это дальше или это ограничение API-интерфейса изменения?

ответ

1

Для того, чтобы читать канал изменений, вы должны использовать CreateDocumentChangeFeedQuery (который никогда не сбрасывает ResponseContinuation), вместо ReadDocumentFeed (который устанавливает значение null, когда результатов больше нет).

См. https://docs.microsoft.com/en-us/azure/documentdb/documentdb-change-feed#working-with-the-rest-api-and-sdk для образца.

+0

Спасибо, это было то, о чем я говорил. Я просто надеялся, что мы сможем это сделать с помощью операции ReadDocumentFeed, вместо того, чтобы читать диапазоны разделов (поскольку нам не нужно масштабировать чтение фида через несколько считывателей, но у нас будет секционированная коллекция). Я думаю, что меня бросило в раздел «Выполнение инкрементного ReadDocumentFeed» в статье, но после перечитания из операции .NET SDK он ссылается на операцию запроса, которую вы упоминаете. –

+0

Также стоит добавить - есть ли причина, по которой метод CreateDocumentChangeFeedQuery не находится на интерфейсе IDocumentClient? Я использую версию 1.11.1 пакета NuGet. Я должен использовать класс DocumentClient напрямую. –

+0

Мы оставили его вне IDocumentClient, потому что добавление новых методов может привести к ошибкам компиляции для разработчиков, которые внедрили макет над IDocumentClient. Но это был популярный запрос, поэтому мы добавим его в предстоящий выпуск. –