gpt4 book ai didi

azure - CosmosDB 租赁集合不再自动创建

转载 作者:行者123 更新时间:2023-12-02 06:05:47 26 4
gpt4 key购买 nike

我在使用 CosmosDBAzure Functions 时遇到了一个非常奇怪的问题。我经常删除数据库并在 DEV 中重新创建它。然后我重新部署函数应用程序。当我在应用程序中调用 API 并调用 CosmosDB 触发器时,我通常会看到创建的 leases 集合。这是一个典型的触发器:

[FunctionName("MyTrigger")]
public static async Task RunAsync([CosmosDBTrigger("MyDatabase", "MyContainer",
ConnectionStringSetting = "CosmosConnectionString", LeaseCollectionName = "leases",
LeaseCollectionPrefix = "MyTrigger", CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents,
ExecutionContext executionContext)
{
// code
}

由于某种原因,不再创建 leases 集合。我重新创建了数据库,多次重新部署了函数应用程序,并且进行了 API 调用,但没有成功。我错过了什么?

编辑:我查看了日志,注意到有很多 Microsoft.Azure.Documents.ChangeFeedProcessor.Exceptions.LeaseLostException 异常,租赁是丢失了消息,所以我不确定发生了什么。

编辑2:这是我从日志中提取的更详细的错误消息:

"Either the source collection 'MyContainer' (in database 'MyDatabase') or the lease collection 'leases' (in database 'MyDatabase') does not exist. Both collections must exist before the listener starts. To automatically create the lease collection, set 'CreateLeaseCollectionIfNotExists' to 'true'

请注意,CreateLeaseCollectionIfNotExists 已设置为 true。

最佳答案

源集合...错误来自此处:https://github.com/Azure/azure-webjobs-sdk-extensions/blob/0683d1bd08a16680c70f982ad00c940b7e9c1fce/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDBTriggerListener.cs#L140它对尝试启动触发器进程时检测到的 NotFound 使用react。

这里的关键是要理解租赁集合的创建是在函数初始化期间发生的,而不是在函数运行时发生的。

如果您在函数运行时删除租用集合(或受监视的集合),您可能会看到由运行实例生成的错误消息。如果出现新实例(由于缩放)或者您重新启动该函数,则创建将在 https://github.com/Azure/azure-webjobs-sdk-extensions/blob/0683d1bd08a16680c70f982ad00c940b7e9c1fce/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDBTriggerAttributeBindingProvider.cs#L155 中开始。 。

那么,这些错误什么时候发生?

  1. 函数初始化 -> CreateIfNotExist 检查并创建 Leases 集合。如果失败,初始化将在此处停止。这会产生一条错误消息。
  2. Function running -> 实例可以运行,如果租约被删除,运行时错误将使 Function 代码重试再次启动进程,由于重试不会再次运行初始化,因此它输出 Either源码合集...
  3. 偶尔会发生租约丢失的情况,在负载均衡场景中,当租约(来自租约集合)分配到新实例时,多个 Function 实例正在运行并分配缩放负载。如果触发器尝试更新检查点并且您突然删除了租约集合,也可能会发生这种情况。

你可以做什么

如果您手动删除租约集合,那么您可以控制可能发生的情况。建议是:

  1. 停止您的功能
  2. 删除租赁集合
  3. 启动您的函数。

如果您不停止该函数并且在其运行时删除租赁存储,该函数的行为是完全未定义的。

关于azure - CosmosDB 租赁集合不再自动创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61686067/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com