我正在应用一个逻辑来检查用户是在线还是离线。我正在使用MQTT和Mosquitto broker以及Java Android。
我允许client A
订阅client-id/status/
,现在每当他的应用程序打开时,就会向client-id/status/
发布一条值为true
的消息。该服务将每30秒发布一次true值,每当他关闭/破坏会话时,就会将另一条值值为false的消息发布到代理。有人会问,如果在应用程序未关闭的情况下网络关闭,我正在使用LWT向client-id/status/
发布错误值,该怎么办
另一个Client B
也在查看Client A
是在线还是离线,现在每当Client B
打开应用程序时,他都会订阅客户端的A状态,并从客户端A接收状态值。
如果在实现MQTT在线/离线逻辑方面有很多知识的人能纠正我做的错误,我会很高兴。感谢您帮助
您的设置还可以,将client-id
放在主题中对于简单的网络来说就足够了。但是,只要您想扩展,您就会欣赏一件事:主题粒度您的主题应该描述尽可能小的事件。在有效负载中包含大量详细信息的伞形事件最终会限制网络的路由配置。尽可能多地将事件放在主题中主题是免费的。命名空间是您的。
因此,具体地说,您的LWT不应该与"实时客户端"状态更改是同一主题。把它做成client-id/status/dropped
之类的。然后,您可以拥有一个额外的节点,它订阅+/status/dropped
并监视网络运行状况。即使单独制作status/online
和status/offline
也没有什么错,尽管我一时想不出一个用例。我向你保证,你稍后会欣赏这个设计的。
我还发现在所有主题前面加上解决方案名称(例如yourname_project_v1
)是很实用的。这并不意味着涵盖同一项目的有效负载版本控制,而是以下场景:
- 您的解决方案的新发展有着模糊相似的主题结构,但有效负载格式不同,并且您希望通过相同的代理运行它(您已经花了很多精力来设置它的可靠性)
- 通过公共免费代理运行,用于测试、原型设计或可能的紧急备份