公众号
关注微信公众号
移动端
创头条企服版APP

MQTT发布/订阅模式介绍

272

MQTT发布/订阅模式

发布订阅模式(Publish-Subscribe Pattern)是一种消息传递模式,它将发送消息的客户端(发布者)与接收消息的客户端(订阅者)解耦,使得两者不需要建立直接的联系也不需要知道对方的存在。

MQTT发布/订阅模式的精髓在于由一个被称为代理(Broker)的中间角色负责所有消息的路由和分发工作,发布者将带有主题的消息发送给代理,订阅者则向代理订阅主题来接收感兴趣的消息。

在MQTT中,主题和订阅无法被提前注册或创建,所以代理也无法预知某一个主题之后是否会有订阅者,以及会有多少订阅者,所以只能将消息转发给当前的订阅者,如果当前不存在任何订阅,那么消息将被直接丢弃。

MQTT发布/订阅模式有4个主要组成部分:发布者、订阅者、代理和主题。

  • 发布者(Publisher)

负责将消息发布到主题上,发布者一次只能向一个主题发送数据,发布者发布消息时也无需关心订阅者是否在线。

  • 订阅者(Subscriber)

订阅者通过订阅主题接收消息,且可一次订阅多个主题。MQTT还支持通过共享订阅的方式在多个订阅者之间实现订阅的负载均衡。

  • 代理(Broker)

负责接收发布者的消息,并将消息转发至符合条件的订阅者。另外,代理也需要负责处理客户端发起的连接、断开连接、订阅、取消订阅等请求。

  • 主题(Topic)

主题是MQTT进行消息路由的基础,它类似URL路径,使用斜杠 / 进行分层,比如 sensor/1/temperature。一个主题可以有多个订阅者,代理会将该主题下的消息转发给所有订阅者;一个主题也可以有多个发布者,代理将按照消息到达的顺序转发。

MQTT还支持订阅者使用主题通配符一次订阅多个主题。

图片1.png

MQTT发布/订阅架构

MQTT发布/订阅中的消息路由

在MQTT发布/订阅模式中,一个客户端既可以是发布者,也可以是订阅者,也可以同时具备这两个身份。当客户端发布一条消息时,它会被发送到代理,然后代理将消息路由到该主题的所有订阅者。当客户端订阅一个主题时,它会收到代理转发到该主题的所有消息。

一般来说,大多数发布/订阅系统主要通过以下两种方式过滤并路由消息。

  • 根据主题

订阅者向代理订阅自己感兴趣的主题,发布者发布的所有消息中都会包含自己的主题,代理根据消息的主题判断需要将消息转发给哪些订阅者。

  • 根据消息内容

订阅者定义其感兴趣的消息的条件,只有当消息的属性或内容满足订阅者定义的条件时,消息才会被投递到该订阅者。

MQTT协议是基于主题进行消息路由的。

MQTT与HTTP请求响应

HTTP是万维网数据通信的基础,其简单易用无客户端依赖,被广泛应用于各个行业。在物联网领域,HTTP也可以用于连接物联网设备和Web服务器,实现设备的远程监控和控制。

虽然使用简单、开发周期端,但是基于请求响应的HTTP在物联网领域的应用却有一定的局限性。首先,协议层面HTTP报文相较与MQTT需要占用更多的网络开销;其次,HTTP是一种无状态协议,这意味着服务器在处理请求时不会记录客户端的状态,也无法实现从连接异常断开中恢复;最后,请求响应模式需要通过轮询才能获取数据更新,而MQTT通过订阅即可获取实时数据更新。

发布订阅模式的松耦合特性,也给MQTT带来了一些副作用。由于发布者并不知晓订阅者的状态,因此发布者也无法得知订阅者是否收到了消息,或者是否正确处理了消息。为此,MQTT 5.0增加了请求响应特性,以实现订阅者收到消息后向某个主题发送应答,发布者收到应答后再进行后续操作。

MQTT与消息队列

尽管MQTT与消息队列的很多行为和特性非常接近,比如都采用发布/订阅模式,但是他们面向的场景却有着显著的不同。消息队列主要用于服务端应用之间的消息存储与转发,这类场景往往数据量大但客户端数量少。MQTT是一种消息传输协议,主要用于物联网设备之间的消息传递,这类场景的特点是海量的设备接入、管理与消息传输。

在一些实际的应用场景中,MQTT与消息队列往往会被结合起来使用,以使MQTT服务器能专注于处理设备的连接与设备间的消息路由。比如先由MQTT服务器接收物联网设备上报的数据,然后再通过消息队列将这些数据转发到不同的业务系统进行处理。

不同于消息队列,MQTT主题不需要提前创建。MQTT客户端在订阅或发布时即自动的创建了主题,开发者无需再关心主题的创建,并且也不需要手动删除主题。

结语

MQTT的发布/订阅机制可以很轻易地满足我们一对一、一对多、多对一的通信需要。这也在很大程度上拓宽了MQTT在IoT领域之外的应用,像网络直播互动、手机消息推送等行业场景,都非常适合使用MQTT。

至此,我们对MQTT的发布/订阅模式有了深刻的理解,读者可以根据本文所学尝试上手使用MQTT协议,开始MQTT应用及服务开发,探索MQTT的更多高级应用。

声明:该文章版权归原作者所有,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本网联系。
您阅读这篇文章花了0
转发这篇文章只需要1秒钟
喜欢这篇 0
评论一下 0
相关文章
评论
试试以这些内容开始评论吧
登录后发表评论
阿里云创新中心
×
#热门搜索#
精选双创服务
历史搜索 清空

Tel:18514777506

关注微信公众号

创头条企服版APP