繁体   English   中英

Azure IoT Hub协议开销和AMQP批处理

[英]Azure IoT Hub protocol overhead and batching with AMQP

背景/ Motiviation

在仔细阅读了Microsoft Azure IoT Hub文档并使用示例后,我仍然对这项技术是否适用于通过间歇性/不可靠且昂贵的网络(例如GSM)连接的设备感到茫然,并且最大限度地降低了成本比最小化延迟更重要。

特别是,我注意到在所有示例中,没有注意消息上的协议开销。 遥测数据总是作为小而简单的消息发送, 例如

{
    "time": "2016-01-26T20:47:53.0000000",
    "dspl": "sensorE",
    "temp": 123,
    "hmdt": 34
}

可能假设实时交付是如此高优先级,成本并不是真正的考虑因素。 我还注意到IoT Hub使用的主题/端点名称非常冗长,这必然会增加开销。

C SDK文档通过提及“批量消息以提高通信效率”,但没有进一步的细节,并且不清楚这是仅适用于HTTP还是AMQP。 还没有提到库如何决定批处理哪些消息。

提到了IoTHubClient_LL_SetOption的“SetBatching”选项 (默认情况下是关闭),但它没有说明这是仅适用于HTTP还是AMQP。 当我查看源代码时,此选项似乎不存在,因此链接文档可能已过期。

更新:更多关于IoTHubClient ”也提到了SetBatching ,但目前还不清楚这是否仅限于HTTP。 (也许批处理不会给AMQP带来任何好处 - 我想更好地理解这一点,这是我问题的核心。)

实际的问题

我想知道,特别是关于Azure IoT C SDK:

  1. 使用AMQP,Azure IoT Hub设备到云消息的典型协议开销是多少?

  2. 使用AMQP时,C SDK中包含用于批处理消息的内容? 例如,如果应用程序快速连续发送3条消息(连接已启动),SDK是否会通过网络将它们合并为一个数据包? 在SDK决定发送消息之前,应用程序向SDK提交消息之间必须经过多长时间,而不是等待查看是否还有更多时间?

  3. 关闭的设备如何确定哪些消息仍由SDK缓存(尚未发送),以便保存这些消息并尝试在下次启动时再次发送它们? (这个很简单 - IoTHubClient_LL_SendEventAsync()有一个回调参数,告诉你实际发送了什么消息。)

AMQP的协议开销非常低 - 它的设计考虑到了这一点。 在协商链接之后,不会随每条数据消息一起发送端点字符串,因此在Azure IoT Hub中这些字符串非常详细并不重要。

Chuck Rolke写了一个例子, AMQP Illustrated ,显示了通用AMQP流量的数据包捕获(不是专门的IoT Hub)。 在示例中,Transfer框架包含“Hello World!” 消息的总大小为47字节 - 因此协议开销为35字节,至少在这种情况下。 (这不包括TCP,IP和以太网标头。)

Microsoft的Olivier Bloch已确认 Microsoft Azure IoT Hub C SDK中的SetBatching选项仅用于HTTP传输。 如果设置了该选项,则SDK将在单个HTTP请求中尽可能多地发送缓冲消息。 当使用HTTP传输时,意图不应该过于频繁地进行请求,因此很可能在HTTP请求之间缓冲多个传出消息。

最终的结论是AMPQ不支持批处理,但它也不是真的需要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM