1

我有一个非常奇怪的问题CosmosDB& Azure 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异常The lease was lost,所以我不确定发生了什么。

EDIT2:这是我能够从日志中提取的更详细的错误消息:

“源集合'MyContainer'(在数据库'MyDatabase'中)或租约集合'leases'(在数据库'MyDatabase'中)不存在。这两个集合必须在侦听器启动之前存在。要自动创建租约集合,请设置'CreateLeaseCollectionIfNotExists' 到 'true'

请注意,CreateLeaseCollectionIfNotExists已设置为 true。

4

1 回答 1

2

Either the source collection...错误来自这里:httpsNotFound ://github.com/Azure/azure-webjobs-sdk-extensions/blob/0683d1bd08a16680c70f982ad00c940b7e9c1fce/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDBTriggerListener.cs#L140在尝试时检测到的反应启动触发过程。

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

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

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

  1. 函数初始化 -> CreateIfNotExist 检查并创建 Leases 集合。如果失败,则初始化在此处停止。这会产生错误消息。
  2. Function running -> Instances can be running,如果租约被删除,运行时错误将使Function code重试重新启动进程,因为重试不会再次运行初始化,它输出Either the source collection...
  3. The lease was lost在将租约(来自租约集合)分配到新实例时,多个 Function 实例正在运行并分配扩展负载的负载平衡场景中偶尔会发生。如果触发器尝试更新检查点并且您突然删除了租约集合,也会发生这种情况。

你可以做什么

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

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

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

于 2020-05-08T23:11:00.523 回答