MQTT 5.0 - 发布订阅模式介绍

MQTT 协议的核心在于发布订阅模式,在本文中,咱们将对这一模式进行深刻的介绍。git

发布订阅模式

发布订阅模式区别于传统的客户端-服务器模式,它使发送消息的客户端(发布者)与接收消息的客户端(订阅者)分离,发布者与订阅者不须要创建直接联系。咱们既可让多个发布者向一个订阅者发布消息,也可让多个订阅者同时接收一个发布者的消息,它的精髓在于由一个被称为代理的中间角色负责全部消息路由和分发的工做。传统的客户端-服务器模式能够实现相似的效果,可是没法作到像发布订阅模式这样简洁和优雅。github

User Guide_1备份.jpg

发布订阅模式的优势在于发布者与订阅者的解耦,这种解耦表如今如下两个方面:服务器

  • 空间解耦,订阅者与发布者不须要创建直接链接,新的订阅者想要加入网络时不须要修改发布者的行为。
  • 时间解耦,订阅者和发布者不须要同时在线,即使不存在订阅者也不影响发布者发布消息。

消息路由

代理做为发布订阅模式的关键角色,它须要准确、高效地向订阅者转发其指望的消息,通常来讲,比较经常使用的有如下两种方式:网络

  • 根据主题。订阅者向代理订阅本身感兴趣的主题,发布者发布的全部消息中都会包含本身的主题,代理根据消息的主题判断须要将消息转发给哪些订阅者。
  • 根据消息内容。订阅者定义其感兴趣的消息的条件,只有当消息的属性或内容知足订阅者定义的条件时,消息才会被投递到该订阅者。严格来说,主题也能够算是消息内容的一种。

发布订阅模式的松耦合特性,也带来了一些反作用。因为发布者并不知晓订阅者的状态,所以发布者也没法得知订阅者是否收到了消息,或者是否正确处理了消息。这种状况下,想要保障交付每每须要更多的消息交互流程,例如,订阅者收到消息后向某个主题发送应答,发布者此时转变为订阅者等待应答。ide

MQTT

MQTT 协议根据主题而不是消息内容来分发消息,每一个消息都包含一个主题,代理无需解析用户数据,这为实现一个通用的、与业务无关的 MQTT 代理提供了可能。用户也能够随意对本身的数据进行加密,这对于广域网通讯是很是有用的。ui

MQTT 主题中能够有多个层级,而且容许对一个或多个层级进行模糊匹配,使客户端可以一次性订阅多个主题。关于 MQTT 主题的详细特性,咱们会在后续的文章中专门进行介绍。加密

与消息队列相比,MQTT 并不要求发布或者订阅以前显式地建立主题,惟一可能形成的不良影响是客户端可能使用错误的主题而不自知,但显然灵活部署带来的收益更高。spa

既然提到了消息队列,那么正好解释一下 MQTT 与消息队列的区别。MQTT 并非消息队列,尽管二者的不少行为和特性很是接近,好比都采用发布订阅模式等,可是他们面向的场景有着显著的不一样。消息队列主要用于服务端应用之间的消息存储与转发,这类场景每每数据量大但接入量少,而 MQTT 面向的是 IoT 领域和移动互联网领域,这类场景的侧重点是海量的设备接入、管理与消息传输。在实际的场景中,二者每每被结合起来使用,譬如先由 MQTT Broker 接收物联网设备上传的数据,而后经过消息队列将这些数据转发到具体应用进行处理。代理

User Guide_1备份 2.jpg

但愿经过这篇简短的文章,您可以对发布订阅模式有一个直观的了解。有关 MQTT 的其余特性,咱们会在后续的文章中展开介绍。blog


更多信息请访问咱们的官网 emqx.io,或关注咱们的开源项目 github.com/emqx/emqx ,详细文档请访问 官方文档

相关文章
相关标签/搜索