后端应用程序仅接收一组Azure IoTHub消息的遥测?

vaqhlq81  于 2023-01-27  发布在  其他
关注(0)|答案(2)|浏览(92)

背景-我有一个后端应用程序,它使用来自IoTHub上“内置消息/事件”路由的遥测消息。遥测是通过使用python SDK创建一个带有EventHubClient的使用者来使用的。设备是以编程方式提供给iothub的,并提供x509证书进行身份验证,创建/到期日期在客户端和CA证书上有效。过去,我有多个设备同时发送到IoThub,并被后端应用程序使用。一段时间后,我们设置了Azure流分析,以侦听与现有后端应用程序相同的后端/路由。现在,我们只能获得一个设备ID,以供原始后端应用程序上的侦听客户端成功使用。
症状-我有2台设备,设备A和设备B。设备A的设备ID为Bob,x509上的CN为Bob。设备B的设备ID为Sally,证书上的CN为Sally。它们都是通过设备配置服务配置的,并由同一CA签名。其在DPS和iothub中加载和验证。使用Bob的凭据的所有遥测都由流分析和原始后端应用程序使用。使用Sally凭据发送的所有遥测仅由流分析使用。我们可以更改设备ID并在设备A或设备B上使用Bob凭据,消息由两个后端使用。如果我们使用Sally设备ID/凭据,它总是只由流分析处理。流分析和原始后端应用程序都设置为$默认消费者组。我认为分区是无关紧要的,除非我使用的是eventhub,但流分析没有分区ID字段,后端应用消费者使用的是分区0。所有消息都将传递到内置端点的事件/消息,没有消息传递到其他端点。
问题-为什么我的后端应用程序只使用Bob的设备ID/凭据的消息?
我试着给予所有相关信息,但如果有什么我遗漏了只是让我知道,我可以提供更多的细节。
编辑:我已经尝试过完全关闭流分析(并重启后端应用以防万一),这样只有后端应用才能接收来自端点的消息,但这没有帮助。但在第一次响应后,我在端点上为流分析创建了一个新的消费者组,并将流分析输入的消费者组更改为该新的消费者组。“症状”没有变化。

6ljaweal

6ljaweal1#

你的所有下游应用程序(在你的情况下是你的原始后端应用程序和Azure流分析作业)应使用它们自己的使用者组,否则它们最终将使用彼此的挂起消息。

rsl1atfo

rsl1atfo2#

这个问题与分区ID有关。我使用azure.eventhub库来使用iothub后端的事件。这个库在过去的10个月左右进行了一次重大的检修。我们使用的是预发布版本(我想是5.0.0b4)因为它确实包含了很多有用的方法,所有的示例代码(EventHubClient.create_consumer)指定的分区"0"。由于iothub基于设备ID确定分区ID,一些设备被发送到分区1。在create_consumer方法中切换分区id显示了这个问题。然后我们只能在后端应用程序上看到所有遥测"Sally",但看不到"Bob"。由于流分析不"我不接受分区ID输入,我假设它消耗了所有分区,这就是它处理所有遥测的原因。
解决方案:我现在使用的是azure.eventhub 5.0.1和EventHubConsumerClient.recieve()方法来使用消息。它似乎在为所有分区执行这项工作。唯一潜在的问题是,它看起来像是从分区中批量提取数据,而不是实时读取整个集线器。目前,我发送数据的频率还没有高到足以造成问题的程度,但在非常高的采样率下,我相信它会从每个分区读取大量消息,如果队列足够大,它会延迟处理来自其他分区的消息,直到它完成批处理。如果您使用无状态平台(如容器示例),它还要求您使用存储帐户进行检查点保存。
编辑:确认-在高采样率下,接收器会监听一个分区一段时间,通常是1或2分钟,然后切换到另一个分区。结果是,由于3个设备频繁发送数据,有几分钟我只从1个设备获得数据,在那之后的几分钟里,我只从其他两个设备获得数据。我从来没有从所有三个设备获得实时处理的数据。真扫兴。

相关问题