【问题标题】:Double queueing of messages to an Azure Queue from an Azure Function从 Azure 函数到 Azure 队列的消息双重排队
【发布时间】:2021-10-18 20:21:17
【问题描述】:

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

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

没有看到函数被触发/调用了两次(据我所知......查看日志等)。我只是看到队列中有双重条目。

基本细节:

  • Node.js (v12) 异步函数
  • 消费计划(版本~3)
  • 运行不到 1 秒
  • 使用context.bindings.outboundQueue = outgoingMessagesArray发送到队列
  • 定时器触发器设置了"useMonitor": false(根据GitHub

有什么想法吗?

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

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)

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

【问题讨论】:

  • 您是否有多个运行的应用程序槽都指向同一个数据源和队列?
  • 并非如此。更清楚一点,我有一个生产槽有这个功能,但生产版本不使用队列。而且我在一个缓慢的阶段有相同功能的变体,但状态槽是唯一使用队列(全新队列)的东西。 prod 每周运行一次,stage 功能每两分钟运行一次(目前用于故障排除)。

标签: azure-functions azure-storage-queues


【解决方案1】:

嗯,@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],因此复制它似乎很好。如有疑问,我建议您拆除旧插槽并制作一个新插槽。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2018-08-26
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多