触发器不再冷启动Azure功能(消耗)



在过去的14个月里,我运行了一个Azure函数,没有出现任何问题。它使用blob触发器在blob存储容器中创建新blob时运行。Blob是间歇性创建的,因此Function几乎完全依赖于冷启动(不考虑延迟)。然而,从一周前开始,Blob触发器不再启动冷启动(就像在中一样,3天后函数仍然没有运行)。但是,当我访问portal.azure中的Function以唤醒它时,blob触发器会为存储中的每个blob触发一次。

有趣的是,我已经有6个多月没有对这个函数进行任何更改了,所以我很难确定原因。

关于Azure功能:

  • 消费计划
  • 运行时版本3.2.0.0
  • Blob存储触发器
  • 我使用Java/Maven进行部署
  • 功能代码(触发器)
@FunctionName("veninv")
public void blob(
@BlobTrigger(
name = "blob",
dataType = "binary",
path = "veninv-prod/{name}",
connection = "AzureWebJobsStorage") 
byte[] content,
@BindingName("name") String blobname,
final ExecutionContext context
)

AzureWebJobsStorage是一个应用程序设置,包含到StorageV2帐户的连接字符串。

预期行为:当在指定的存储容器中创建新blob时,函数的blob触发器会启动冷启动并唤醒函数。

实际行为:创建新blob时,函数的blob触发器不会启动冷启动。相反,函数必须在portal.azure中手动唤醒,之后blob触发器将为每个blob触发一次。

到目前为止我所做的事情:

  • "诊断并解决问题";在我的函数中没有显示错误
  • 我已确认功能设置为消耗计划
  • 我重新启动了Function应用程序
  • 我已经完成了一个HTTP POST请求来同步触发器
  • 我启用了Scale Controller日志记录,它显示了上次运行Function后的以下四个日志:

2021-10-14T20:35:11.0707779Z添加或更新触发器。{"类别":"ScaleControllerLogs","AppName":"veninv Prod","时间戳":"2021-10-14T20:35:11.0707779Z","TriggersHash":"35243DA6","SlotName":"操作":"刷新触发器"、"触发器更新":"[{"连接":"AzureWebJobsStorage","functionName":"veninv","路径":"veninv prod\/{name}"dataType":"二进制"类型":"blobTrigger"方向":"在"name":"blob"useMonitor":null}]"}

2021-10-14T20:35:11.0707779Z已使用ConnectionString创建CloudStorageAccount。{"类别":"ScaleControllerLogs","AppName":"veninv Prod","时间戳":"2021-10-14T20:35:11.0707779Z","TriggersHash":"35243DA6","SlotName":"动作":"触发信息"}

2021-10-14T20:58:41.7386529 z实例计数已更改{"类别":"ScaleControllerLogs","AppName":"veninv Prod","时间戳":"2021-10-14T20:58:41.7386529Z","SlotName":"生产","操作":"ScaleResult","原因":"一个实例被删除,因为所有功能都处于空闲状态或正在查看负载的稳定下降计数":"0"PreviousInstanceCount":"1〃}

2021-10-14T20:58:41.7386529 z应用程序不再分配给任何实例,并且可能随时空闲。{"类别":"ScaleControllerLogs","AppName":"veninv Prod","时间戳":"2021-10-14T20:58:41.7386529Z","SlotName":"Production","Action":"TriggerInformation","FunctionName":"N/A","触发器散列":"35243DA6"}

根据此文档,冷启动是

尚未使用的应用程序需要更长时间才能启动的现象。

在消费计划中,Azure函数主机的实例是根据传入事件的数量动态添加和删除的。

如果您编写了繁重的代码并部署在消耗计划中,这需要大量内存和资源才能加载执行,那么可能需要更多时间。因此,您所面临的问题可能取决于代码、资源和函数宿主。

由于您没有得到任何错误来解决此问题,而不是使用Blob触发器,因此您可能希望在此场景中使用事件网格触发器。当客户端通过调用blob REST API创建、替换或删除blob时,会触发这些事件。

最新更新