【问题标题】:Dealing with frequent device Twin reads and throttling处理频繁的设备双读和节流
【发布时间】:2020-12-02 23:19:15
【问题描述】:

Azure IoT PCS Remote Monitoring repository 的启发,我开始开发自己的基于 Azure IoT Hub 的 IoT 系统。

与 IoT PCS 存储库类似,我有一个 API 端点 (/api/devices),它返回我的 IoT 中心上的设备列表 - 当客户端发出请求时,我使用 Microsoft.Azure.Devices SDK 和 RegistryManager 创建一个查询并返回设备孪生列表。这个 API 端点在我的前端 SPA 应用中使用和使用。

var result = await registryManager
                .CreateQuery("SELECT * FROM devices", 100)
                .GetNextAsTwinAsync(options);

这很好用,但是我发现如果你经常运行这个查询,你会很快遇到 throttling。我使用的是 S1 层,如果我理解正确,我可以每分钟最多进行 20 个 Twin 查询。假设我的系统和客户群增长,这并不能很好地扩展。即使在更高的层级上,规模也没有那么高。

问题是 - 您希望如何处理这个限制?

到目前为止,我最好的想法是将 IoT 中心设备 (Twin) 数据复制到 CosmosDB/SQL Server 中,并使用 IoT Hub endpoints 同步所有孪生更改。然后,我不会直接查询 IoT Hub,而是查询 CosmosDb/SQL。我不知道这种方法是否有用。

【问题讨论】:

  • 为什么不订阅事件而不是手动查询呢?这是要求吗?我相信 ModuleClient 具有 SetDesiredPropertyUpdateCallbackAsync ,您可以在其中传递回调来处理新报告的数据
  • 我提到的 API 由我的前端使用并用于呈现 UI。例如,/api/devices 端点返回 IoT Hub 上的设备列表,然后用于在我的前端呈现表。
  • 我明白了,在那种情况下,我不认为它是为此目的而设计的。中间可能需要一个中介或中间件来规避限制。

标签: c# azure azure-iot-hub azure-iot-edge


【解决方案1】:

我可以确认,订阅孪生更改并复制所需的更改并报告给经常读取的数据库是一个可行的解决方案。

管道如下所示:IoT Hub -> Message routing:Endpoint -> Consumer -> To Db -> Fast无限读取。

【讨论】:

    【解决方案2】:

    问题是 - 您希望如何处理这个限制?

    基于文档Reference - IoT Hub quotas and throttling:

    Throttle    Free, B1, and S1    B2 and S2       B3 and S3
    --------------------------------------------------------------
    Queries       20/min/unit       20/min/unit     1,000/min/unit
    

    您可以根据需要使用门户或以编程方式(例如 REST PUT request)扩展您的查询以增加单元数量(最多 200 个单元)。

    【讨论】:

      猜你喜欢
      • 2016-03-27
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多