amazon-web-services - 请求/响应的 MQTT 主题名称
问题描述
我正在设计一个系统,其中包含许多使用 MQTT 连接到中央代理的设备。
有一些主设备可以向某些从设备发送请求。来自一个主站的请求通常被定向到一个从站。
请求的主题可以是: mysystem/slaveId/req
,因此从属可以订阅该主题,而主可以发布到同一主题。只有被寻址的从机才会收到请求,因为它应该是。
我的问题是如何确定回复的主题。我在:mysystem/slaveId/res/masterId
或者只是mysystem/slaveId/res
.
在第一种情况下,我应该masterId
在请求的有效负载中发送到从站,这样从站就可以构造响应主题名称。只有发送请求的主机才能收到答复。
在第二种情况下,所有活动的主人都会收到响应,因为主题不包含masterId
. 发送请求的主机应该通过查看requestId
有效负载中的 a 来检测其响应(这也是在请求有效负载中发送的)。
我认为第一个选择更好,但是 AWS 的Device Shadow服务使用类似于第二个选择的主题名称。例如,响应获取请求的设备将消息发布到$aws/things/myLightBulb/shadow/get/accepted
. 因此,每个设备都会收到消息,而不仅仅是请求的那个。
我认为 AWS 做出了很好的选择,所以我很想遵循它……但是我不确定我是否理解他们的工作。
解决方案
“好的选择”取决于上下文,这里上下文不同。设备影子旨在跟踪并准确反映设备的状态。您链接的页面没有讨论一个设备有多个阴影,并且可能没有考虑到多个接收器。尽管如此,它的简单主题架构仍然可以在每个设备具有多个影子的系统中工作,因为影子应该接收来自其设备的所有响应。这些响应中的任何一个都可能揭示设备状态的变化,并且客户端未收到响应的任何影子都将过时,并且与其他影子不同步。
你的主人听起来不像影子。也许他们独立地将他们的结果报告给充当影子的数据存储。也许响应中的任何内容都不能代表请求之外值得跟踪的状态变化。无论哪种方式,文档听起来都与您的目标无关。
我支持您对首选的偏好,尤其是随着节点数量的增加。主要缺点是跟踪请求主 ID 的额外工作。这对大师来说很容易(每个人都可以订阅mySystem/+/res/masterId
,并且在具有主题访问控制的系统中,您甚至可以隔离它们)。如果请求正文很简单(尚未解析多个属性),您可能会考虑让主服务器发布到mysystem/slaveId/req/masterId
(从服务器可以订阅mysystem/slaveId/req/+
)。
AWS 的最大例子可能是主题中清晰的层次感。如果在主题末尾包含 masterId 的解析便利不是您最关心的问题,那么排序为:(mysystem/masterId/slaveId/req
或res
)可能更有意义。非常依赖于您的系统和目标。
推荐阅读
- firebase - 所有文档的通用 Firestore 触发器
- android - 当应用程序在运行模式下启动时,Canvas 对象为空,而在调试模式下运行时对象具有值
- android - 运行 Android 模拟器 - 分段错误
- html - HTML表格垂直对齐文本
- r - 计算两列日期之间的天数和变量值
- python - 如何将 Z3_ast 导出为二进制文件以及如何在其中搜索 func 名称?
- java - 如何使用蒙版网格创建自定义按钮?
- c# - 有没有办法使用表达式从 SQLite.net 查询的模型中获取数据?
- react-native - 如何在应用程序的主屏幕上显示 Flatlist 组件?
- javascript - onPress 在 ios 设备的菜单中不起作用