后端应用程序仅接收一部分 Azure IoT 中心消息的遥测数据?
Backend app only receiving telemetry for a sebset of azure IoTHub messages?
背景 - 我有一个后端应用程序使用来自 IoTHub 上 "built-in messages/events" 路由的遥测消息。通过使用 python SDK 使用 EventHubClient 创建使用者来使用遥测。设备以编程方式提供给 iothub,并提供 x509 证书进行身份验证,creation/expiration 日期在客户端和 CA 证书上有效。过去,我有多个设备同时发送到 IoThub 并被后端应用程序使用。一段时间后,我们设置了 azure stream analytics 来监听与现有后端应用程序相同的 backend/route。快进几个月了,现在我们只能获得一个设备 ID 以供原始后端应用程序上的监听客户端成功使用。
症状- 我有2台设备,设备A和设备B。设备A的设备ID是Bob,x509上的CN是Bob。 Device B的设备ID为Sally,证书上的CN为Sally。它们都是通过设备配置服务配置的,并由同一个 CA 签名,该 CA 在 DPS 和 iothub 中加载和验证。所有使用 Bob 凭据的遥测都被流分析和原始后端应用程序使用。使用 Sally 凭据发送的所有遥测数据仅由流分析使用。我们可以更改设备 ID 并在设备 A 或设备 B 上使用 Bob 凭据,消息由两个后端使用,如果我们使用 Sally 设备 id/credentials,它始终仅由流分析处理。流分析和原始后端应用程序都设置为 $Default 消费者组。我相信分区是无关紧要的,除非我使用的是 eventhub,但流分析没有分区 ID 字段,后端应用程序消费者正在使用分区 0。所有消息都被传送到 events/messages 内置-在端点中,没有消息传递到其他端点。
问题 - 为什么我的后端应用程序只使用设备 ID/credentials 为 Bob 使用消息?
我试图提供所有相关信息,但如果有遗漏的信息,请告诉我,我可以提供更多详细信息。
编辑:
我已经尝试完全关闭流分析(并重新启动后端应用程序以防万一),因此只有后端应用程序正在使用来自端点的消息,这没有帮助。但自从第一次响应后,我在端点上创建了一个新的消费者组以进行流分析,并将流分析输入的消费者组更改为该新消费者组。 "symptoms" 没有变化。
您所有的下游应用程序,在您的情况下是您的原始后端应用程序和 Azure 流分析作业,应该使用它们自己的消费者组,否则它们最终会互相消费待处理的消息。
问题与分区 ID 有关。我正在使用 azure.eventhub 库来使用来自 iothub 后端的事件。这个库在过去 10 个月左右的时间里进行了一次大修。我们使用的是预发布版本(我认为是 5.0.0b4),因为它确实包含了很多有用的方法,并且该版本 (EventHubClient.create_consumer) 的所有示例代码都指定了分区“0”。由于 iothub 根据设备 ID 确定分区 ID,因此一些设备被发送到分区 1。在 create_consumer 方法中切换分区 ID 显示了问题。然后,我们只能在后端应用程序上看到所有遥测 "Sally",但 none "Bob"。由于流分析不接受分区 ID 输入,我假设它会消耗所有分区,这就是它处理所有遥测数据的原因。
解决方案:我现在使用 azure.eventhub 5.0.1 和 EventHubConsumerClient.recieve() 方法来使用消息。它似乎正在为所有分区做这项工作。唯一的潜在问题是它看起来像是从分区中提取批量数据,而不是实时读取整个集线器。目前,我没有以足够高的频率发送数据,这是一个问题,但我相信它会以非常高的采样率从每个分区读取消息块,如果队列足够大,它会延迟处理消息从其他分区直到它完成它的批处理。如果您使用像容器实例这样的无状态平台,它还要求您使用存储帐户来定位检查点。
Confirmed-采样率高,接收器会先听一个分区一段时间,通常是1或2分钟,然后切换到另一个分区。结果是 3 台设备频繁发送数据,有几分钟我只能从 1 台设备获取数据,之后的几分钟我只能从其他 2 台设备获取数据。我从来没有从实时处理的所有 3 个设备中获取数据。无赖。
背景 - 我有一个后端应用程序使用来自 IoTHub 上 "built-in messages/events" 路由的遥测消息。通过使用 python SDK 使用 EventHubClient 创建使用者来使用遥测。设备以编程方式提供给 iothub,并提供 x509 证书进行身份验证,creation/expiration 日期在客户端和 CA 证书上有效。过去,我有多个设备同时发送到 IoThub 并被后端应用程序使用。一段时间后,我们设置了 azure stream analytics 来监听与现有后端应用程序相同的 backend/route。快进几个月了,现在我们只能获得一个设备 ID 以供原始后端应用程序上的监听客户端成功使用。
症状- 我有2台设备,设备A和设备B。设备A的设备ID是Bob,x509上的CN是Bob。 Device B的设备ID为Sally,证书上的CN为Sally。它们都是通过设备配置服务配置的,并由同一个 CA 签名,该 CA 在 DPS 和 iothub 中加载和验证。所有使用 Bob 凭据的遥测都被流分析和原始后端应用程序使用。使用 Sally 凭据发送的所有遥测数据仅由流分析使用。我们可以更改设备 ID 并在设备 A 或设备 B 上使用 Bob 凭据,消息由两个后端使用,如果我们使用 Sally 设备 id/credentials,它始终仅由流分析处理。流分析和原始后端应用程序都设置为 $Default 消费者组。我相信分区是无关紧要的,除非我使用的是 eventhub,但流分析没有分区 ID 字段,后端应用程序消费者正在使用分区 0。所有消息都被传送到 events/messages 内置-在端点中,没有消息传递到其他端点。
问题 - 为什么我的后端应用程序只使用设备 ID/credentials 为 Bob 使用消息?
我试图提供所有相关信息,但如果有遗漏的信息,请告诉我,我可以提供更多详细信息。
编辑: 我已经尝试完全关闭流分析(并重新启动后端应用程序以防万一),因此只有后端应用程序正在使用来自端点的消息,这没有帮助。但自从第一次响应后,我在端点上创建了一个新的消费者组以进行流分析,并将流分析输入的消费者组更改为该新消费者组。 "symptoms" 没有变化。
您所有的下游应用程序,在您的情况下是您的原始后端应用程序和 Azure 流分析作业,应该使用它们自己的消费者组,否则它们最终会互相消费待处理的消息。
问题与分区 ID 有关。我正在使用 azure.eventhub 库来使用来自 iothub 后端的事件。这个库在过去 10 个月左右的时间里进行了一次大修。我们使用的是预发布版本(我认为是 5.0.0b4),因为它确实包含了很多有用的方法,并且该版本 (EventHubClient.create_consumer) 的所有示例代码都指定了分区“0”。由于 iothub 根据设备 ID 确定分区 ID,因此一些设备被发送到分区 1。在 create_consumer 方法中切换分区 ID 显示了问题。然后,我们只能在后端应用程序上看到所有遥测 "Sally",但 none "Bob"。由于流分析不接受分区 ID 输入,我假设它会消耗所有分区,这就是它处理所有遥测数据的原因。
解决方案:我现在使用 azure.eventhub 5.0.1 和 EventHubConsumerClient.recieve() 方法来使用消息。它似乎正在为所有分区做这项工作。唯一的潜在问题是它看起来像是从分区中提取批量数据,而不是实时读取整个集线器。目前,我没有以足够高的频率发送数据,这是一个问题,但我相信它会以非常高的采样率从每个分区读取消息块,如果队列足够大,它会延迟处理消息从其他分区直到它完成它的批处理。如果您使用像容器实例这样的无状态平台,它还要求您使用存储帐户来定位检查点。
Confirmed-采样率高,接收器会先听一个分区一段时间,通常是1或2分钟,然后切换到另一个分区。结果是 3 台设备频繁发送数据,有几分钟我只能从 1 台设备获取数据,之后的几分钟我只能从其他 2 台设备获取数据。我从来没有从实时处理的所有 3 个设备中获取数据。无赖。