【问题标题】:Azure Function App Cosmos DB trigger connection dropAzure Function App Cosmos DB 触发连接断开
【发布时间】:2021-02-09 16:39:58
【问题描述】:

我正在使用带有 cosmos DB 触发器的函数应用程序,在本地运行时,这种行为非常奇怪,因为我随机停止接收事件,例如与 Lease 集合的连接断开。我收到一条错误消息,指出 Blob 存储的读取操作失败,但不确定这是否相关。这是错误:

There was an error performing a read operation on the Blob Storage Secret Repository. 
Please ensure the 'AzureWebJobsStorage' connection string is valid

我正在使用以下代码运行函数应用:func host start --cors * --verbose

这是我可以在控制台中看到的 CosmosDBOptions 对象:

[2021-02-09T16:17:58.305Z] CosmosDBOptions
[2021-02-09T16:17:58.307Z] {
[2021-02-09T16:17:58.307Z]   "ConnectionMode": null,
[2021-02-09T16:17:58.308Z]   "Protocol": null,
[2021-02-09T16:17:58.309Z]   "LeaseOptions": {
[2021-02-09T16:17:58.310Z]     "CheckpointFrequency": {
[2021-02-09T16:17:58.310Z]       "ExplicitCheckpoint": false,
[2021-02-09T16:17:58.311Z]       "ProcessedDocumentCount": null,
[2021-02-09T16:17:58.311Z]       "TimeInterval": null
[2021-02-09T16:17:58.312Z]     },
[2021-02-09T16:17:58.313Z]     "FeedPollDelay": "00:00:05",
[2021-02-09T16:17:58.313Z]     "IsAutoCheckpointEnabled": true,
[2021-02-09T16:17:58.314Z]     "LeaseAcquireInterval": "00:00:13",
[2021-02-09T16:17:58.314Z]     "LeaseExpirationInterval": "00:01:00",
[2021-02-09T16:17:58.315Z]     "LeasePrefix": null,
[2021-02-09T16:17:58.316Z]     "LeaseRenewInterval": "00:00:17"
[2021-02-09T16:17:58.316Z]   }
[2021-02-09T16:17:58.323Z] }

还有我的 host.json 文件:

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[1.*, 2.0.0)"
  }
}

最后,这个问题从我添加了一个共享文件夹开始,不确定它是否相关,但它真的很烦人,删除租约集合解决了暂时的问题,但它花费了大量时间并且所有其他正在运行的功能都中断了,因为我清理了所有集合。

【问题讨论】:

  • 此错误与 Cosmos DB 触发器无关,而是取决于用于内部操作的 Azure 存储服务的 Functions 运行时。 Cosmos DB 触发器没有依赖关系,也没有访问任何存储帐户。删除租约集合可能与修复无关,而是与您重新启动函数有关。 CosmosDBOptions 并不真正相关,在 Trigger 的情况下重要的是 Trigger 本身的配置。
  • 可能与github.com/Azure/azure-functions-durable-js/issues/…有关,您是否将AzureWebJobsStorage正确配置为指向存储帐户或模拟器?
  • 我没有正确配置 AzureWebJobsStorage,我认为 Azure 存储不是本地开发的依赖项。我正在尝试使用模拟器,并会在此更新您
  • @MatiasQuaranta 将AzureWebJobsStorage 配置为 Azure 存储,但它第一次仍然可以工作,然后..Host lock lease acquired by instance ID '000000000000000000000000xxxxxxxx' 这很奇怪,因为 1/2 功能正在工作。在谷歌上找到那篇建议重启系统的文章 LOL docs.microsoft.com/en-us/answers/questions/165592/…
  • 尝试重新启动,问题仍然存在。如何获取触发器配置?现在没有函数被触发

标签: azure azure-function-app


【解决方案1】:

TLDR;使用 CosmosDB 模拟器进行本地开发可以解决这个问题,因为您不会有两个函数指向同一个租约集合。

有两点很重要:

  1. 如果您在 Azure 上部署了一个 Azure 函数,并且在您的计算机上本地运行一个具有相同的租约配置以侦听同一受监视集合中的更改,那么这些将表现为同一部署的多个实例并且更改将交付给其中一个,您可能会在 Azure 中运行的那个上遇到“事件丢失”。这记录在https://docs.microsoft.com/en-us/azure/cosmos-db/troubleshoot-changefeed-functions#some-changes-are-missing-in-my-trigger 中。如果你想让2个独立的Function监听同一个被监控集合的变化,共享同一个租约集合,你需要使用LeaseCollectionPrefix配置https://docs.microsoft.com/en-us/azure/cosmos-db/how-to-create-multiple-cosmos-db-triggers
  2. 您在本地看到的错误可能与未运行 Azure 存储模拟器或未在本地配置 AzureWebJobsStorage 配置以使用它有关。 Azure Functions 运行时(与 Cosmos DB 触发器无关)需要存储帐户。您可以将UseDevelopmentStorage=true 用于本地存储模拟器。

【讨论】:

  • 我在第一点,设置 LeaseCollectionPrefix 解决了问题,但不是一个好的选择,因为它是在功能级别定义的,如果我部署它。部署的版本将指向该前缀,然后我需要在本地再次更改我的前缀,这不是很一致..有意义吗?
  • 您可以使用基于配置的前缀,例如%Environment%,因此当它在 Azure 中时,您有一个用于 Environment = Azure 的 Function App 设置,当在本地运行时,您可以有一个在您的 appSettings.local.json 中设置,将其设置为 Local。
  • 理想情况下,如果您在本地,您最终会使用与生产环境不同的开发环境,而不是挂钩到产品集合/帐户。但如果这不可能,那么拥有替代配置应该是前进的方向。
  • 如果成本是一个问题,您始终可以将租约集合放在具有共享吞吐量的数据库中,因此您有 2 个租约集合(一个用于生产,一个用于开发)并且您将 dev 指向第二个,或者您最终使用 2 个租约前缀。两者的费用相同。
  • 嗯。不,这不是成本问题,我认为这是设计问题,如果我有一个本地运行的 cosmosDB 模拟器,我可以让本地 cosmosDB 集合触发该功能吗?
猜你喜欢
  • 1970-01-01
  • 2019-02-06
  • 2023-01-31
  • 1970-01-01
  • 2019-01-04
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
相关资源
最近更新 更多