从 Azure 函数到 Azure 队列的消息双重排队

Double queueing of messages to an Azure Queue from an Azure Function

我在计时器触发器上有一个 Azure 函数 运行,它从数据源中找到一组记录并使用它来构建消息数组,然后将其发送到队列输出。

该函数报告(通过 context.log())找到 4 条记录,然后为队列构建一个包含 4 条消息的数组。但是队列收到 8 条消息。

没有两次看到函数triggered/invoked(据我所知...查看日志等)。我只是看到队列中有两个条目。

基本情况:

有什么想法吗?

更新: 唉……好吧,现在我看到了双重函数调用。日志如下所示:

2021-08-17T14:28:00.011 [Information] Executing 'Functions.sendToQueue' (Reason='Timer fired at 2021-08-17T14:28:00.0112754+00:00', Id=f41c233f-42c9-4da6-ac8a-f354d04be0df)
2021-08-17T14:28:00.012 [Information] Executing 'Functions.sendToQueue' (Reason='Timer fired at 2021-08-17T14:28:00.0117734+00:00', Id=3b0a8941-604e-45b4-839b-33eb5e467751)
2021-08-17T14:28:00.133 [Information] Found 4 locations
2021-08-17T14:28:00.134 [Information] Built 4 messages
2021-08-17T14:28:00.220 [Information] Executed 'Functions.sendToQueue' (Succeeded, Id=f41c233f-42c9-4da6-ac8a-f354d04be0df, Duration=209ms)
2021-08-17T14:28:00.490 [Information] Found 4 locations
2021-08-17T14:28:00.490 [Information] Built 4 messages
2021-08-17T14:28:00.554 [Information] Executed 'Functions.sendToQueue' (Succeeded, Id=3b0a8941-604e-45b4-839b-33eb5e467751, Duration=542ms)

但是,调用下的门户监视器每两分钟仅报告一次调用。即使该日志显示计时器似乎触发了两次(相隔几分之一秒)。

好吧,@bjorne 让我找到了正确的方向!

由于部署错误,这个使用队列的修订函数确实 运行 在两个插槽中,而不仅仅是在 stg 插槽中。

让我非常沮丧的是,当我查看门户中 stg 插槽的监视器日志流时,该日志流向我显示来自两个插槽的调用!所以它看起来一直都是来自 stg 插槽。

所以希望这可以帮助人们避开兔子踪迹;如果您正在使用插槽并看到双重调用或双重结果,请检查您的所有插槽并且不一定信任单个插槽的日志记录。

更新: 我相信看到来自两个插槽的日志是因为两个插槽具有相同的 WEBSITE_CONTENTSHARE 应用程序设置。这就是导致我的代码意外地“在两个地方”部署的原因,并且当每个插槽具有不同的 WEBSITE_CONTENTSHARE 应用程序设置时,日志记录问题似乎也消失了。

更新 2: 不幸的是,这还不是一个完整的答案。每个插槽手动设置 WEBSITE_CONTENTSHARE 确实解决了问题,但插槽交换无法按预期工作。请参阅 this GitHub issue 与 Microsoft 的人员确认问题并确认它仍然没有真正正常工作。因此,确实如描述的那样工作,但您不能使用插槽交换。

更新 3: 每个插槽手动设置 WEBSITE_CONTENTSHARE 有效。只需确保插槽名称是随机的(例如 my-function-app-0a1b2c3d)。插槽在门户中自动命名的方式似乎是 [function-app-name]-[random-8-char-hex-value],因此复制它似乎不错。如有疑问,我建议您拆除旧插槽并制作一个新插槽。