mqtt:如何强制执行完整消息状态后跟增量
mqtt: how to enforce full message state followed by deltas
研究 mqtt 作为一种通过 websockets 向浏览器客户端发布消息的方法。
数据可能类似于 JSON 对象,其字段值随时间变化。我只想发送那些更改,而不是每条消息的整个 JSON 状态。
协议中是否有内置方式(或其他一些解决方法)允许客户端接收完整的连接状态,然后是仅增量消息?
一种可能的解决方法是将完整状态保留在设置了 retain
标志的单独主题上,我们会在连接建立后立即订阅该主题,然后在收到消息后取消订阅。但是那样我们仍然会面临消息排序问题——不能保证增量主题上的消息按照预期的顺序遵循最后的状态。此外,最初为每个感兴趣的实体订阅 2 个主题而不是一个主题会产生开销。
不,MQTT 中没有任何东西可以为您做这件事。
最好的方法可能是首先通过 HTTP 传送大负载,然后为结构中的每个字段创建一个主题,并发布对每个主题的更新。如果您在每次更新中包含一个时间戳,您也可以为完整数据添加时间戳,这样您就可以在下载完整对象之前订阅更新。如果您也为它加上时间戳,那么您可以先订阅更新,并在获得全部更新后应用所需的更新。当您下载大对象时,这将解决更新问题。
研究 mqtt 作为一种通过 websockets 向浏览器客户端发布消息的方法。
数据可能类似于 JSON 对象,其字段值随时间变化。我只想发送那些更改,而不是每条消息的整个 JSON 状态。
协议中是否有内置方式(或其他一些解决方法)允许客户端接收完整的连接状态,然后是仅增量消息?
一种可能的解决方法是将完整状态保留在设置了 retain
标志的单独主题上,我们会在连接建立后立即订阅该主题,然后在收到消息后取消订阅。但是那样我们仍然会面临消息排序问题——不能保证增量主题上的消息按照预期的顺序遵循最后的状态。此外,最初为每个感兴趣的实体订阅 2 个主题而不是一个主题会产生开销。
不,MQTT 中没有任何东西可以为您做这件事。
最好的方法可能是首先通过 HTTP 传送大负载,然后为结构中的每个字段创建一个主题,并发布对每个主题的更新。如果您在每次更新中包含一个时间戳,您也可以为完整数据添加时间戳,这样您就可以在下载完整对象之前订阅更新。如果您也为它加上时间戳,那么您可以先订阅更新,并在获得全部更新后应用所需的更新。当您下载大对象时,这将解决更新问题。