CosmosDb неожиданное продолжение токена - PullRequest
1 голос
/ 05 апреля 2019

Обратите внимание:

  • Я считаю, что этот вопрос отличается от того, который здесь говорит о том, почему токен продолжения равен нулю.Проблема, перечисленная здесь, связана с обсуждением этого неожиданного поведения и посмотреть, есть ли какое-либо решение для него.
  • Я также сообщил об этом на cosmosdb github , потому что на этом этапе я думаю, что это можеточень хорошо быть ошибкой SDK или Cosmos API.

Вот так:

В принципе я не получаю результата с маркером продолжения в неожиданной ситуации.

Единственный подобный опыт (никакого результата, кроме токена продолжения), который у меня был с CosmosDb, был, когда RU недостаточно, и для запроса требуется больше RU, чтобы завершить свою работу.Например, при подсчете всех документов и вам нужно продолжить пару раз.

Как воспроизвести проблему?

Это очень трудно воспроизвести, как это делает потребительне контролирует распределение шардов (физических разделов).Но вам нужен comosdb, который имеет несколько логических разделов и как минимум два сегмента, и ваш запрос должен быть сформирован с целью получения данных во втором общем доступе.Не указывайте ключ разделения и не делайте запрос перекрестным.

Ожидаемое поведение

Когда:

  • запрос является перекрестным разделом
  • достаточно RU
  • запрос стоит очень маленького RU

Я ожидаю получить результат при первом вызове.

Фактическое поведение

Результат запроса пуст. Ответ имеет необычный токен продолжения. Маркер выглядит следующим образом:

{"token": null, "range ": {" min ":" 05C1DFFFFFFFFC "," max ":" FF "}}

Ниже приведен пример кода, который я могу воспроизводить каждый раз.В этом случае у меня есть документ, расположенный в разделе 2 (индекс 1), который я предполагаю, что это второй осколок.

var client = new DocumentClient(ServiceEndpoint, AuthKey);
const string query = "select * from c where c.title='JACK CALLAGHAN'";
var collection = UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId);
var cQuery = client.CreateDocumentQuery<dynamic>(collection, query, new FeedOptions
{
    EnableCrossPartitionQuery = true,
    PopulateQueryMetrics = true
}).AsDocumentQuery();

var response = cQuery.ExecuteNextAsync().GetAwaiter().GetResult();

Console.WriteLine($"response.AsEnumerable().Count()= {response.AsEnumerable().Count()}");

foreach (string headerKey in response.ResponseHeaders.Keys)
{
    Console.WriteLine($"{headerKey}");
    var keyValues = response.ResponseHeaders[headerKey].Split(";");
    foreach (var keyValue in keyValues)
    {
        Console.WriteLine($"{keyValue}");
    }
    Console.WriteLine();
}

И вывод, включая все заголовки:

response.AsEnumerable().Count()= 0
Cache-Control
no-store, no-cache

Pragma
no-cache

Transfer-Encoding
chunked

Server
Microsoft-HTTPAPI/2.0

Strict-Transport-Security
max-age=31536000

x-ms-last-state-change-utc
Wed, 03 Apr 2019 00:50:35.469 GMT

x-ms-resource-quota
documentSize=51200
documentsSize=52428800
documentsCount=-1
collectionSize=52428800

x-ms-resource-usage
documentSize=184
documentsSize=164076
documentsCount=94186
collectionSize=188910

lsn
118852

x-ms-item-count
0

x-ms-schemaversion
1.7

x-ms-alt-content-path
dbs/bettingedge/colls/fixtures

x-ms-content-path
S8sXAPPiCdc=

x-ms-xp-role
1

x-ms-documentdb-query-metrics
totalExecutionTimeInMs=0.27
queryCompileTimeInMs=0.04
queryLogicalPlanBuildTimeInMs=0.02
queryPhysicalPlanBuildTimeInMs=0.03
queryOptimizationTimeInMs=0.00
VMExecutionTimeInMs=0.06
indexLookupTimeInMs=0.05
documentLoadTimeInMs=0.00
systemFunctionExecuteTimeInMs=0.00
userFunctionExecuteTimeInMs=0.00
retrievedDocumentCount=0
retrievedDocumentSize=0
outputDocumentCount=0
outputDocumentSize=49
writeOutputTimeInMs=0.00
indexUtilizationRatio=0.00

x-ms-global-Committed-lsn
118851

x-ms-number-of-read-regions
0

x-ms-transport-request-id
12

x-ms-cosmos-llsn
118852

x-ms-session-token
0:-1#118852

x-ms-request-charge
2.86

x-ms-serviceversion
version=2.2.0.0

x-ms-activity-id
c4bc4b76-47c2-42e9-868a-9ecfe0936b1e

x-ms-continuation
{"token":null,"range":{"min":"05C1DFFFFFFFFC","max":"FF"}}

x-ms-gatewayversion
version=2.2.0.0

Date
Fri, 05 Apr 2019 05:40:21 GMT

Content-Type
application/json

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

Это нормальное поведение или ошибка?

1 Ответ

0 голосов
/ 25 апреля 2019

Использование .NET Framework будет обрабатывать токен продолжения изначально:

`var query = Client.CreateDocumentQuery (UriFactory.CreateDocumentCollectionUri (databaseId, collectionI, sqlQuery, feedOptions) .AsDocumentQuery ();

while (query.HasMoreResults)

{var response = await query.ExecuteNextAsync (); results.AddRange (response);} `

Добавление отзыва, предоставленного через связанный выпуск GitHub :

По поводу ваших проблем мы столкнулись с одинаковыми ситуациями. У меня есть некоторые комментарии.

мы не знали об этом поведении, и наш клиент получил пустой список с продолжениемтокен и в значительной степени прервал наш поток.

Теперь на стороне сервера мы обрабатываем эту ситуацию и продолжаем до тех пор, пока не получим результат. Вопрос в том, что если будет 1000 разделов. Нужно ли продолжать 100 раз?как ComosDB защищает свой SLA и время отклика менее 10 мс. $ ThinkingLoud

Да, это нарушило наш поток и в первый раз. Bно мы обрабатываем его и на стороне сервера (вместе с MaxNumberOfObjects мы продолжаем обслуживать запрос до тех пор, пока не получим число, которое хочет клиент), и шаблон, который вы видите, обусловлен базовой архитектурой CosmosDB, состоящей из phyiscal + logicперегородки.Похоже, вы реализуете пейджинг с взаимодействием вашего клиента, и это нормально.Тем не менее, я не думаю, что это то, на что ссылается CosmosDB со своими временами SLA.

Какие еще непредсказуемые непредсказуемые действия могут удивить нас в производственной среде?# ThinkingLoudAgain

Это немного расплывчато, но я бы посоветовал вам прочитать обо всех FeedOptions вместе с советами по производительности CosmosDB и убедиться, что вы понимаете их, а также области их применения.

РЕДАКТИРОВАТЬ: Кроме того, еще одно предупреждение.В настоящее время я сталкиваюсь с проблемой с токеном продолжения и ключевым словом DISTINCT в запросе SQL.Он не работает должным образом без ORDER BY.

...