目录
3、MQTT 客户端、 Broker 、和连接建立(Connection Establishment)
4、MQTT 发布、订阅和取消订阅(Publish, Subscribe & Unsubscribe)
(4)MQTT Best practices(主题使用建议)
1、MQTT 介绍
MQTT(Message Queuing Telemetry Transport)是一个客户端服务器发布/订阅消息的传输协议。它轻量,开源,简单,设计方便。这些特性使得它在许多情况下非常适合使用,在受限制的环境,例如机器和机器之间的通信(M2M)以及物联网(IoT)环境中的通信等等。在这些环境中,网络带宽非常宝贵,需要小的代码占用。
MQTT 规范的抽象很好地描述了 MQTT 的特征。它是一种非常轻量级的二进制协议,由于它的包开销非常的小,与 HTTP 等协议相比,MQTT 在通过网络传输数据时表现更出色。该协议的另一个重要特征是 MQTT 非常容易在客户端实现。易用性是 MQTT 开发中的一个关键问题,这使得它非常适合资源有限的受限设备。// 轻量,易用
2、MQTT 发布-订阅模式
文档连接。在客户机-服务器模型中,客户机直接与服务器通信。发布/订阅模型将发送消息的客户机(发布者)与接收消息的服务器(订阅者)分离开来。发布者和订阅者不直接进行通信。事实上,他们甚至都不知道对方的存在。它们之间的连接由第三个组件( broker )处理。broker 的工作是过滤所有传入的消息并将它们正确地分发给订阅者。// 很好描述了发布-订阅模式和客户端-服务器模式的区别
发布/订阅最重要的特征是消息的发布者与接收者(订阅者)的解耦。这种解耦有几个维度:空间解耦、时间解耦、通信同步解耦。
(1)Broker 可拓展
在发布/订阅模式中, broker 上的操作可以高度并行化,消息可以以事件驱动的方式处理。消息缓存和消息的智能路由通常是提高可伸缩性的决定性因素。然而,扩大到数百万个节点仍然是一个挑战。这样高级别的连接可以通过集群代理节点来实现,利用代理节点,使用负载平衡器将负载分布到更多的独立服务器上。// 有点类似网关的概念 + 负载均衡
(2)Broker 消息过滤
基于主题的过滤(SUBJECT-BASED FILTERING):根据主题(subject / topic)分发消息。通常,主题是具有层次结构的字符串,允许基于有限数量的表达式进行过滤。
基于内容的过滤(CONTENT-BASED FILTERING):broker 基于特定的内容筛选器语言筛选消息。broker 接收客户端订阅,并根据客户端查询过滤消息。这种方式的显著缺点是,客户端必须事先知道消息的内容,并且消息不能加密或随意变更。
基于类型的过滤(TYPE-BASED FILTERING):当使用面向对象语言时,基于消息(事件)的类型或者类进行筛选是一种常见的方式。例如,订阅者可以监听类型为 Exception 或任何子类型的所有消息。
(3)MQTT 的主要特征是什么?
空间上解耦发布者和订阅者:要发布或接收消息,发布者和订阅者只需要知道代理的主机名/IP和端口。
时间上解耦:尽管大多数 MQTT 用例以接近实时的方式传递消息,但是如果需要,broker 可以为不在线的消费端存储消息。
异步处理消息:因为大多数客户端程序(libraries)是异步工作的,它们基于回调或类似的模式,所以在等待消息或者发布消息时并不会阻塞任务。在某些用例中,需要进行消息同步,为了等待一个特定的消息,有些库提供了同步 API。但是,消息流通常还是异步的。
MQTT 使用基于主题的消息过滤方式。每条消息都包含一个主题(subject),broker 可以根据该主题决定订阅的客户端是否能获得此消息。
在发布/订阅模式中,MQTT有三个服务质量(QoS)级别。如果一个主题没有订阅者,broker 也必须知道如何进行处理。比如,可以让 broker 简单地将每条消息记录到数据库中,方便后续进行分析。同时,为了保持分层主题树的灵活性,需要非常仔细地去设计主题树并为未来的用例留下足够的空间。// 简单的说的就是发布订阅中的一些东西,无订阅情况怎么处理,主题怎么设计等
(4)MQTT 和消息队列的区别
消息队列存储消息,直到消息被消费。在消息队列中,消息不可能不被任何消费者处理,就像在 MQTT 中没有人订阅主题一样。// 主题必须订阅,消息必须有消费者。
消息队列中一条消息只被一个 client 使用。在传统消息队列中,消息只能由一个消费者处理。在 MQTT 中,行为恰恰相反,订阅主题的每个订阅者都将获得消息。// 很多消息中间件都支持这个操作
消息队列中,队列是命名的,而且必须显式创建,定义队列比定义主题要更加的严格。在使用队列之前,必须使用单独的命令显式地创建队列。只有在队列被命名和创建之后,才有可能发布或使用消息。相比之下,MQTT 主题非常灵活,可以动态创建。// 消息队列这里指的仅仅只是简单的队列,从以上对比情况来看,有点类似于数据结构中的 Queue
3、MQTT 客户端、 Broker 、和连接建立(Connection Establishment)
(1)MQTT 客户端
消息发布者和订阅者都是一个 MQTT 客户端(发布和订阅功能也可以在同一个MQTT Client中实现)。MQTT 客户端可以是任何运行 MQTT Library (程序类库)并通过网络连接到 MQTT Broker 的设备(从微控制器到功能齐全的服务器)。基本上,任何通过 TCP/