当前位置: 首页 > 知识库问答 >
问题:

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

蔚俊人
2023-03-14

背景-我有一个后端应用程序,使用IoTHub上“内置消息/事件”路由的遥测消息。遥测是通过使用python SDK使用EventHubClient创建消费者来使用的。设备以编程方式配置到iothub,并提供x509证书进行身份验证,创建/过期日期在客户端和CA证书上有效。过去,我曾有多台设备同时发送到IoThub,并被后端应用程序使用。一段时间后,我们设置azure stream analytics以侦听与现有后端应用程序相同的后端/路由。快进几个月,现在我们只能获得一个设备ID成功地被原始后端应用程序上的侦听客户端使用。

症状-我有两个设备,设备A和设备B。设备A的设备ID是Bob,x509上的CN是Bob。设备B的设备ID为Sally,证书上的CN为Sally。它们都是通过设备供应服务供应的,并由同一CA签名,该CA在DPS和iothub中加载和验证。所有使用Bob凭据的遥测都被stream analytics和原始后端应用程序使用。使用Sally凭据发送的所有遥测数据仅被流分析使用。我们可以更改设备ID并在设备A或设备B上使用Bob凭据,消息由两个后端使用,如果我们使用Sally设备ID/凭据,则始终仅由流分析处理。stream analytics和原始后端应用程序都设置为$Default consumer group。我相信分区是不相关的,除非我使用的是eventhub,但流分析没有分区id字段,后端应用程序消费者使用的是分区0。所有消息都将传递到事件/消息内置endpoint,没有消息传递到其他endpoint。

问题-为什么我的后端应用程序只使用Bob的设备ID/凭据的消息?

我试图提供所有相关信息,但如果我遗漏了什么,请告诉我,我可以提供更多细节。

编辑:我已经尝试完全关闭流分析(并重新启动后端应用以防万一),因此只有后端应用正在使用来自endpoint的消息,这没有帮助。但是在第一次响应之后,我在endpoint上创建了一个新的用于流分析的消费者组,并将流分析输入的消费者组更改为该新消费者组。“症状”无变化。

共有3个答案

郎羽
2023-03-14

确认-在高采样率下,接收器将监听一个分区一段时间,通常为1或2分钟,然后切换到另一个分区。结果是,在3台设备频繁发送数据的情况下,几分钟内我只从1台设备获取数据,几分钟后我只从其他2台设备获取数据。我从未从实时处理的所有3台设备获取数据。真倒霉

叶经略
2023-03-14

此问题与分区ID有关。我使用azure.eventhub库从iothub后端使用事件。这个图书馆在过去10个月左右的时间里一直在进行大修。我们使用的是预发布版本(我认为是5.0.0b4),因为它确实包含了许多有用的方法,并且所有的示例代码(EventHubClient.create_consumer)都指定了分区0。因为iothub根据设备ID确定分区ID,所以一些设备被发送到分区1。在create_consumer方法中切换分区id显示了这个问题。然后,我们只能在后端应用程序上看到所有遥测“莎莉”,但看不到“鲍勃”。由于流分析不接受分区id输入,我假设它消耗所有分区,这就是它处理所有遥测的原因。

解决方案:我现在使用azure。eventhub 5.0.1和eventhub ConsumerClient。recieve()方法来使用消息。它似乎在为所有分区执行任务。唯一的潜在问题是,它看起来像是从分区中提取批量数据,而不是实时读取整个集线器。目前,我发送数据的频率还不够高,这是一个问题,但我相信它将以非常高的采样率从每个分区读取大量消息,如果队列足够大,它将延迟处理来自其他分区的消息,直到完成批处理。如果您使用的是无状态平台(如容器实例),它还要求您使用存储帐户作为检查点位置。

万俟英锐
2023-03-14

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

 类似资料:
  • 几天前,我发布了这个问题,来自Azure IOT中心的短信 我曾尝试实现建议的logic app,我的问题是logic app没有通过服务总线接收任何消息,事实上没有消息到达服务总线。当我尝试在logic应用程序中运行触发器时,它会弹出一个对话框,告诉我“When_a_message_is_received_in_a_queue”。当我运行logic应用程序时,它说工作流程在几分钟后超时。 我复制

  • 来自Firebase网站上的文档:https://firebase.google.com/docs/cloud-messaging/downstream 当您的应用处于后台时传递的通知。在这种情况下,通知会传递到设备的系统托盘。默认情况下,用户单击通知会打开应用启动器。 当我的应用程序收到云消息并且我的应用程序在后台时,如果我需要做些什么。 是否可以在自定义BroadcastReceiver或服务

  • 我可能已经阅读了所有其他与此相关的SO线程,但我找不到答案,而且在Android监视器中也没有日志跟踪。有人对此有提示吗?

  • 我目前正努力在nServiceBus托管的应用程序上启动并运行一些东西。我有一个第三方正在向其发布消息的azure ServiceBus队列,我希望我的应用程序(目前在本地托管)接收这些消息。 我在谷歌上搜索了如何配置endpoint的答案,但我在有效的配置中没有运气。有人这样做过吗,因为我可以找到如何连接到Azure存储队列但不是服务总线队列的示例。(由于其他原因,我需要Azure servic

  • 概述 为了能够让轻应用订阅号的开发者接收到用户在消息窗口的留言消息,开发者可以在管理后台设置消息服务器并开启接收用户对话消息模式。 设置消息服务器时接需要提供可用的接收消息的回调URL地址,为了让通信更加安全,建议使用https。 设置成功并开启了接收对话消息模式后,用户在轻应用或订阅号窗口里发送的消息会推送给设置的URL,服务器接收到消息后,可以通过异步发送消息接口给用户回复消息。 设置消息服务

  • 如何发送buf然后接收msg 方法 我正在尝试通过从连接出站发送msg并从入站接收msg然后返回消息Mono来实现此方法。但我只能在that(Publisher)方法中接收消息。它似乎无法返回数据Mono 我试过这个。 但它会一直阻塞,直到连接超时 我尝试了另一个代码。我添加了一个handle方法,并将响应放到map中。然后我可以得到单声道。fromSupply(),在映射处有一个while循环中