背景-我有一个后端应用程序,它使用IoTHub上“内置消息/事件”路由中的遥测消息。通过使用python SDK与EventHubClient创建使用者来消耗遥测。设备通过编程方式提供给iothub,并提供x509证书进行身份验证,创建/到期日期在客户端和CA证书上有效。过去,我有多个设备同时发送到IoThub,并被后端应用程序占用。一段时间后,我们设置了Azure流分析以侦听与现有后端应用程序相同的后端/路由。快进几个月,现在我们只能让一个设备ID被原始后端应用程序上的监听客户端成功使用。
症状-我有两个设备,设备A和设备B。设备A的设备ID为Bob,x509上的CN为Bob。设备B的设备ID为Sally,证书上的CN为Sally。它们都通过设备供应服务进行供应,并由同一CA签名,该CA在DPS和iothub中均已加载和验证。流分析和原始后端应用程序都消耗了使用Bob凭据的所有遥测。使用Sally凭据发送的所有遥测仅由流分析使用。我们可以更改设备ID,并在设备A或设备B上使用Bob凭据,并且两个后端都使用消息,并且如果我们使用Sally设备ID /凭据,则始终只能通过流分析对其进行处理。流分析和原始后端应用程序都设置为$ Default消费组。我相信除非我使用eventhub,否则该分区是不相关的,但是流分析没有用于分区ID的字段,并且后端应用使用者使用的是分区0。所有消息都将传递到事件/消息内置端点,并且没有邮件传递到其他端点。
问题-为什么我的后端应用程序只使用Bob带有设备ID /凭据的消息?
我试图提供所有相关信息,但是如果有遗漏的地方,请告诉我,我可以提供更多详细信息。
编辑: 我已经尝试过完全关闭流分析(并重启后端应用程序以防万一),因此只有后端应用程序正在消耗来自端点的消息,这无济于事。但是,自从第一个响应之后,我在端点上创建了一个新的使用者组以进行流分析,并将该使用者组更改为该新使用者组的流分析输入。 “症状”没有变化。
答案 0 :(得分:0)
您的所有下游应用程序(对于您的原始后端应用程序和Azure Stream Analytics作业),应使用其自己的使用者组,否则它们最终将占用彼此的待处理消息。
>答案 1 :(得分:0)
问题与分区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()方法来使用消息。它似乎在为所有分区做这项工作。唯一的潜在问题是,它看起来像是从分区中提取了一批数据,而不是实时读取整个集线器。目前,我没有以足够高的频率发送数据,这是个问题,但是我认为它以很高的采样率会读取每个分区中的消息块,如果队列足够大,则会延迟处理消息从其他分区直到完成批处理。如果您使用的是无状态平台(例如容器实例),则还需要使用存储帐户来设置检查点。
答案 2 :(得分:0)
已确认-在高采样率的情况下,接收器将收听一个分区一段时间(通常为1或2分钟),然后切换到另一个分区。结果是,在3台设备频繁发送数据的情况下,几分钟之内,我仅从一台设备中获取数据,此后几分钟,我仅从其他2台设备中获取数据。我从不实时获取所有3台设备的数据。闷闷不乐。