MQTT 5.0

一世执手 提交于 2020-02-25 19:01:12

MQTT 5.0 - 发布订阅模式介绍

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

发布订阅模式

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

发布订阅模式的优点在于发布者与订阅者的解耦,这种解耦表现在以下两个方面:

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

消息路由

代理作为发布订阅模式的关键角色,它需要准确、高效地向订阅者转发其期望的消息,一般来说,比较常用的有以下两种方式:

  • 根据主题。订阅者向代理订阅自己感兴趣的主题,发布者发布的所有消息中都会包含自己的主题,代理根据消息的主题判断需要将消息转发给哪些订阅者。
  • 根据消息内容。订阅者定义其感兴趣的消息的条件,只有当消息的属性或内容满足订阅者定义的条件时,消息才会被投递到该订阅者。严格来讲,主题也可以算是消息内容的一种。

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

MQTT

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

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

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

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

希望通过这篇简短的文章,您能够对发布订阅模式有一个直观的了解。有关 MQTT 的其他特性,我们会在后续的文章中展开介绍。


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!