【问题标题】:Microsoft AZURE blob triggered function working intermittentlyMicrosoft AZURE blob 触发功能间歇性工作
【发布时间】:2017-03-06 02:28:49
【问题描述】:

我们的 Blob 触发函数遇到了问题。 该函数是用javascript编写的。 我们很难为其实施自动化部署流程。 以下是我们遵循的步骤。

  1. 使用 ARM 模板和参数文件在现有资源组中创建函数应用 New-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateFile $templateFilePath -TemplateParameterFile $armParametersFilePath;

  2. 通过Kudu api部署功能代码 Invoke-RestMethod -Uri "$apiUrl" -Method Put -InFile "$functionCodeArchivePath" -Credential $credentials -DisableKeepAlive -UserAgent "powershell/1.0" -TimeoutSec 600

  3. 通过kudu api运行npm install命令 Invoke-RestMethod -Uri "$apiCommandUrl" -Method Post -Body $json -DisableKeepAlive -ContentType "application/json" -Credential $credentials -UserAgent "powershell/1.0" -TimeoutSec 1200

在最后一步 - 获取 Kudu 上的依赖项 (npm install) 的命令超时,这似乎是 known issue

为了克服这个问题,我们使用 WebPack 将所有依赖项打包到一个 JavaScript 文件中,遵循this approach

现在部署速度更快了,但功能似乎没有正确执行。

当我们将文件放入我们的 blob 存储帐户时,该函数会从 触发,该函数似乎并不总是记录执行跟踪。 有些运行包含完整的日志,有些运行只包含 Function started 而没有任何自定义日志语句。

这里是直接来自 Kudu 的日志 (D:\home\LogFiles\Application\Functions\Function\functionname>)

2017-03-03T11:24:33.835 Function started (Id=77b5b022-eee0-45e0-8e14-15e89de59835)
2017-03-03T11:24:35.167 JavaScript blob trigger function started with blob:
2017-03-03T11:24:35.167 Name: _1486988111937 
 Blob Size: 8926 Bytes
2017-03-03T11:24:35.167 Extracting file
2017-03-03T11:24:35.167 JavaScript blob trigger function processed blob 
 Name: _1486988111937 
 Blob Size: 8926 Bytes
2017-03-03T11:24:35.183 Function completed (Success, Id=77b5b022-eee0-45e0-8e14-15e89de59835)
2017-03-03T11:24:35.292 { Error: [** SENSITIVE ERROR MESSAGE, INTERNAL TO FUNCTION, REMOVED **] }
2017-03-03T11:28:34.929 Function started (Id=8bd96186-50bc-43b0-916c-fefe4bd0cf51)
2017-03-03T11:38:18.302 Function started (Id=7967cc93-73cf-4acf-8428-20b0c70bbac9)
2017-03-03T11:39:32.235 Function started (Id=a0abb823-9497-429d-b477-4f7a9421132e)
2017-03-03T11:49:25.164 Function started (Id=ab16b1d9-114c-4718-aab2-ffc426cfbc98)
2017-03-03T11:53:51.172 Function started (Id=87ed29bc-122f-46d2-a658-d933330580c9)
2017-03-03T11:56:06.512 Function started (Id=23f8ee3f-cda0-45a3-8dd0-4babe9e45e4e)
2017-03-03T12:02:58.886 Function started (Id=c7ef7ad5-62b8-4b43-a043-bc394d9b02f5)

PS:我们的函数代码正在获取 blob,一个压缩文件,解压缩它并对压缩文件夹中的每个文件进行 API 调用。日志中标有[** SENSITIVE ERROR MESSAGE, INTERNAL TO FUNCTION, REMOVED **]的错误与我们的API连接有关。

【问题讨论】:

  • 您的容器中有多少 blob?
  • 每个 Function App 可以打开的套接字连接数有一个上限。您可以批量处理 API 调用吗?
  • @don-lockhart blob 不多,最多 5 个。 blob 的数量会影响函数的调用吗?
  • @ling-toh 好点,我想我们可以。达到上限会影响其他功能的执行吗?
  • 如果您有大量 blob(超过 10,000 个),则可能不会发生触发器。所以,这不是你的问题。

标签: azure azure-functions


【解决方案1】:

看起来 Blob 触发并不那么可靠,至少根据此页面:How to use Azure blob storage with the WebJobs SDK

WebJobs SDK 扫描日志文件以监视新的或更改的 blob。这个过程不是实时的;在创建 blob 几分钟或更长时间后,函数可能不会被触发。此外,存储日志是在“尽力而为”的基础上创建的; 无法保证所有事件都会被捕获。在某些情况下,可能会丢失日志。如果您的应用程序无法接受 blob 触发器的速度和可靠性限制,推荐的方法是在创建 blob 时创建队列消息,并使用 QueueTrigger 属性而不是 BlobTrigger 上的属性处理 blob 的函数。

您可能应该更改逻辑并为放入 Blob 存储中的每个文件创建一个队列消息

【讨论】:

  • 我不认为这是@Halima 的函数没有记录“函数完成...”条目的原因。该功能正在被触发,因为正在记录“功能已启动...”。需要明确的是,关于您突出显示的粗体短语,“日志可能会丢失”是指“存储日志”,而不是“功能日志”(这是帖子所指的)。
  • @LingToh 日志问题可能只是一个症状或完全不同的问题。主要问题是 Blob 触发函数的不可靠触发。当我读到它时,如果你想要可靠的结果,建议不要使用它,例如生产。
  • 大家好,谢谢大家的帮助,看来@robert-vuković 的回答可能会导致我们的问题。我们正在研究实现一个队列触发机制。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 2021-10-13
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多