繁体   English   中英

在 Linux Docker 中查询 Asp.net Core/Kestrel 中的布尔属性的 Firestore 崩溃

[英]Querying Firestore for Boolean property in Asp.net Core/Kestrel Crashes in Linux Docker

这是在 IIS Express 和 Firestore 模拟器上使用 C# 在 Asp.Net Core 2.0 中本地工作的东西。 我正在尝试基于 GCP 的相同代码,其中 Asp.Net 核心在 GCP (Kubernetes) 的 Linux 容器内的 Kestrel 上运行

我可以确认这是特定于 Firestore 并且特定于使用布尔属性进行查询的,因为其他查询工作正常。

        CollectionReference FoosRef = FirestoreDb.Collection(FooKind);
        Query query = FoosRef.WhereEqualTo("IsGoodFoo", true);
        // QuerySnapshot querySnapshot = await query.Offset(offset).GetSnapshotAsync();
        // Query query = FoosRef.WhereEqualTo("FooName", "p,ezbnR33GU_");
        QuerySnapshot querySnapshot = await query.GetSnapshotAsync();
        DocumentSnapshot documentSnapshot = querySnapshot.Documents.FirstOrDefault();

正如您所看到的,注释代码在相同设置中运行良好,同时查询“IsGoodFoo”并失败。 我可以确认 Firestore 上的数据仅保存为布尔值,因为在 Firestore UI 中搜索“true”不会给我任何结果。 (在 Firestore 模拟器上查询真实作品)

由于这是一次严重的崩溃,我也没有看到任何写入 StackDriver 的日志,也不知道在哪里检查 Kestrel 日志或正确调试此问题。

结果证明问题不是“使用布尔属性进行查询”,而是“尝试检索具有大约 200,000 个结果的查询结果”。

有几个选项可以执行此操作。 当查询仍然具有足够少的结果时,最简单的一种方法是使用StreamAsync方法。 使用 C# 8(以及支持较新版本IAsyncEnumerable<>的 Google.Cloud.Firestore API 的 2.x 版),您可以使用如下代码:

var stream = collection.WhereEqualTo("IsGoodFoo", true).StreamAsync();
await foreach (var document in stream)
{
    // Do whatever with the document
}

在我的测试中(使用 900K+ 结果查询),在获取 ~210K 项目后一分钟后超时。 我还不清楚这是否符合预期。

一个更强大的替代方法是使用限制和游标发出查询,直到查询没有检索到该限制。 这是一个例子:

int limit = 1000;
var query = collection.WhereEqualTo("IsGoodFoo", true).Limit(limit);

// Used to specify a cursor
DocumentSnapshot lastDocument = null;
while (true)
{
    var queryWithCursor = lastDocument is null ? query : query.StartAfter(lastDocument);
    var querySnapshot = await queryWithCursor.GetSnapshotAsync();
    foreach (var document in querySnapshot)
    {
        // Use the document
    }
    if (querySnapshot.Count != limit)
    {
        break;
    }
}

请注意,虽然您可以指定Offset而不是使用游标,但当偏移量非常大时,这会显着降低效率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM