【问题标题】:Azure Function miss IoT triggerAzure Function 错过 IoT 触发器
【发布时间】:2020-06-18 21:49:15
【问题描述】:

我正在使用 Azure 功能来处理来自 IOT 中心的消息并输出到 Blob 存储。 enter image description here

但是当我高频发送时,该功能错过了 IOT 消息。 例如,我从 20:40:16 到 20:40:23 发送了 30 条消息,但只有 3 条被处理并存储到 Blob 存储中,其余 27 条我不知道去哪里。 enter image description here

我正在使用函数消耗计划,Azure 声明它将根据负载自动缩放。 但是从上面的活动日志来看,它只有一个线程在运行,甚至没有对输入进行排队,导致一些消息丢失。

那么,我应该怎么做才能捕获来自 IOT hub 的所有消息?

【问题讨论】:

  • 如果没有看到您的代码,很难确定消息是否真的丢失了或者您有错误。您是否知道您可以在 IoT 中心设置路由规则并让它自动将所有设备遥测数据写入 Blob 存储?
  • 我确信这些消息已到达 Azure,因为我可以在 ServiceBusExplorer 中看到它们。在我的情况下可能无法执行路由规则,因为我将无法采用 JSON 格式的二进制数据发送到 Azure,这也是为什么我需要函数来解码我的消息而不是保存到 Blob
  • 这又发生了吗?还是这是您第一次观察到这种行为?
  • 嗨 SatishBoddu,根据我的观察,当物联网消息接收频率高于函数处理速度时,这种情况一直发生。在我看来,该函数始终是单线程并且从不缓冲输入。这是应该的消费计划还是我的设置问题?

标签: azure azure-functions azure-iot-hub


【解决方案1】:

自己找到了解决方案。 触发器需要从 Azure 事件中心更改为事件网格触发器,如下图所示。

Azure Event Hubs Azure Grid Trigger

【讨论】:

    【解决方案2】:

    消费计划上的 Azure Functions 可以处理此负载,但您可能希望在 IoT 中心中创建一个单独的使用者组以供该函数使用。在 Azure 门户中,转到内置终结点并添加一个新的使用者组。

    然后你必须在你的函数中指定使用哪个消费者组

        [FunctionName("Function1")]
        public static async Task Run([IoTHubTrigger("messages/events",ConsumerGroup = "functions", Connection = "EventHubConnectionAppSetting")]EventData message, 
    

    我使用消费计划功能对此进行了测试,该功能侦听 IoT 中心默认端点并延迟 8 秒写入 blob 存储,以使其更像您的功能。无论我发送 30 条还是 100 条消息,我都没有看到消息丢失。确保没有其他应用程序正在使用您的新消费者组!

    【讨论】:

    • 您好 Matthijs,感谢您的回复。我按照您的建议创建了一个新功能消费者组,但问题仍然存在。我确信这不是其他进程与函数在同一个消费者组中竞争的问题,因为函数是我帐户中的唯一服务,我还测试了将每个任务减少到 40 毫秒,在这种情况下,我可以看到 Blob 中的所有消息贮存。我也尝试设置 FUNCTIONS_WORKER_PROCESS_COUNT = 10,但根据函数监视器,该函数仍在运行单线程。
    • 太糟糕了,值得一试。有没有办法可以共享问题中的代码?您的问题可能与您正在执行的 IO 相关。
    • 嗨 Matthijs,我自己找到了解决方案作为我发布的答案,不知道为什么更改有效,但无论如何,它正在工作。感谢您的帮助。
    • 我很高兴你找到了答案,很好奇为什么会解决它。
    猜你喜欢
    • 2020-02-27
    • 2021-12-22
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2019-08-21
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多