【问题标题】:Missing results from cosmosDB queries over a few hours几个小时内缺少 cosmosDB 查询的结果
【发布时间】:2019-12-17 09:07:16
【问题描述】:

在 8 月 6 日当天,我们在查询 cosmosDB 时遇到了一个反复出现的问题。

我们的查询缺少结果,但我们仍然收到“有效”回复。在我们的应用程序的一些非常批评的查询中没有返回批次结果。 例如,一个应该返回 250 个文档的请求返回了 240 个。跨越 5-6 小时框架的多个查询具有这些不完整的结果。查询的数据是 不可否认地存在于数据库中。

我们使用与此类似的 sn-p 进行查询,使用 200 个文档的分页:

public static List<T> ToList<T>(this IDocumentQuery<T> documentQuery)
{
    List<T> documents = new List<T>();
    while (documentQuery.HasMoreResults)
    {
        documents.AddRange(documentQuery.ExecuteNextAsync<T>().Result);
    }
    return documents;
}

IDocumentQuery 是通过强制转换 IQueryable 来初始化的,有点像这样:

queryable.AsDocumentQuery()

使用的解决方案类似于 microsoft 文档中的内容:https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.documents.linq.documentqueryable.asdocumentquery?view=azure-dotnet

我们目前正在将我们的数据解决方案迁移到 cosmosDB,这就是我们注意到问题的方式。 你有什么想法可能导致这种情况吗?我们应该期待更多相同类型的问题吗?你知道吗 我们如何确定我们收到的结果不完整?

【问题讨论】:

    标签: azure-cosmosdb iqueryable


    【解决方案1】:

    恐怕你在使用CreateDocumentQuery方法时需要设置MaxItemCount属性,否则MaxItemCount默认值为-1。如果数据太大,可能会在吞吐量限制内截断数据结果集。

    你可以参考这个案例:Pagination in Cosmos DB using Page Size and Page Number你可以从Continuation Token Example那里得到一些线索。

    private static async Task<KeyValuePair<string, IEnumerable<CeleryTask>>> QueryDocumentsByPage(int pageNumber, int pageSize, string continuationToken)
        {
            DocumentClient documentClient = new DocumentClient(new Uri("https://{CosmosDB/SQL Account Name}.documents.azure.com:443/"), "{CosmosDB/SQL Account Key}");
    
            var feedOptions = new FeedOptions {
                MaxItemCount = pageSize,
                EnableCrossPartitionQuery = true,
    
                // IMPORTANT: Set the continuation token (NULL for the first ever request/page)
                RequestContinuation = continuationToken 
            };
    
            IQueryable<CeleryTask> filter = documentClient.CreateDocumentQuery<CeleryTask>("dbs/{Database Name}/colls/{Collection Name}", feedOptions);
            IDocumentQuery<CeleryTask> query = filter.AsDocumentQuery();
    
            FeedResponse<CeleryTask> feedRespose = await query.ExecuteNextAsync<CeleryTask>();
    
            List<CeleryTask> documents = new List<CeleryTask>();
            foreach (CeleryTask t in feedRespose)
            {
                documents.Add(t);
            }
    
            // IMPORTANT: Ensure the continuation token is kept for the next requests
            return new KeyValuePair<string, IEnumerable<CeleryTask>>(feedRespose.ResponseContinuation, documents);
        }
    

    【讨论】:

    • 正如原帖中提到的,我们按 200 个项目的块进行分页,我们使用 MaxItemCount 属性。
    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 2015-05-12
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多