MQTT发布_订阅架构(Pub_Sub)

MQTT发布/订阅架构(Pub/Sub)

本文中,将深入研究Pub/Sub架构,在软件架构中一个消息模式,它支持不同组件或系统之间以解耦的方式进行通信。
在前一片文章[MQTT简介]http://t.csdnimg.cn/6lNeZ中,对MQTT有一个整体的理解。现在来探究Pub/Sub模型对IoT应用的好处,以及各种消息过滤技术,理解MQTT、Pub/Sub和消息队列之间的区别。为了做好准备工作,我们通过清晰定义发布/订阅模式做为开始。

MQTT:发布/订阅(Pub/Sub)架构

在发布/订阅架构中,有产生消息的发布者和接收消息的订阅者。但是发布-订阅是一个宽泛的概念,有请多技术或协议可以实现。

MQTT就是这样一种遵循发布-订阅架构的特定消息传递协议。MQTT使用一种以代理为基础的模型,客户端可以连接到代理,消息被发送到主题。订阅者然后可以订阅指定的主题,然后接收被发布的消息。

MQTT:发布/订阅的解耦功能

相对于传统的客户端-服务端(请求-响应)模型,发布/订阅架构提供了一种独特的替代方案。在请求-响应方式中,客户端直接和服务端通信,从而会造成降低性能的瓶颈。另外,发布/订阅模型解耦了消息的发布者和订阅者。发布者和订阅者并不关心对方的存在。作为一个第三方,代理处理处理他们之间的连接。这种解耦产生了一种更快速、更高效的通信流程。
通过消除发布者和订阅者之间直接通信的需要,发布/订阅架构消除了IP和端口的交换。它还提供解耦功能,允许两个组件上的操作在发布或接收期间连续通信而不间断。发布/订阅具有三个维度的解耦功能,以实现最佳效率:

  • 空间解耦: 发布者和订阅者无需知道对方的存在。
  • 时间解耦: 发布者和订阅者无需在同一时间运行。
  • 同步解耦: 在发布或接收过程中,不需要中断两个组件的操作。

在MQTT协议中的解耦
MQTT从空间上将发布者和订阅者解耦,这就意味着,它们只需要知道代理的主机名称或IP及端口,就可以发布和接收消息。另外,MQTT在时间上进行解耦,允许代理为不在线的客户端存储消息。必须满足两个条件来存储数据:客户端必须已经连接代理,并订阅了QoS大于0的主题。

发布/订阅软件架构最重要的一个优点是能够过滤所有消息,并准确的分发给订阅者,消除了发布者和订阅者要知道对方存在的需要。

发布/订阅消息的过滤功能

消息过滤功能是发布/订阅架构中非常重要的一个方面,因为这可以使订阅者只接收它们关心的消息。发布/订阅代理(broker)提供了几种过滤选择,包括基于主题的过滤、基于内容的过滤和基于类型的过滤。

选择1:基于主题的过滤

这是最常用的过滤选择,代理通过主题(topic)过滤消息。客户端通过主题订阅它们感兴趣的消息,而代理通过主题层次结构将消息路由到相应的订阅者。主题的结构是有层级的,通过斜杠(/)分层,允许订阅者接收与特定主题级别或主题层级结构匹配的消息。下面是一个主题层级示例:
在这里插入图片描述

优点
  • 简单易用
  • 灵活,允许分层主题结构
  • 高效,因为只将消息发送给对特定主题感兴趣的订阅者。
缺点
  • 发布者和订阅者要提前约定好主题的分层格式。
  • 仅能根据主题层级过滤消息。
用例

基于主题的过滤最适合于订阅者对主题特定子集感兴趣的场景。比如,在一个智能家居系统中,订阅者可能对某个房间的温度变化感兴趣,那该订阅者会订阅一个类似smart-home/living-root/temperature的主题,然后代理(broker)就只会发送匹配这个主题的消息给订阅者。

MQTT使用基于主题的方式过滤消息。每个消息都对应一个主题,代理基于此确定订阅者是否接收该消息。关于主题的更多内容,会在后续章节介绍。为了处理发布/订阅中的一些业务,MQTT有三个QoS等级(前面章节介绍过),基于此,MQTT可以轻松处理客户端发送消息到代理,或代理推送消息到客户端。但是,有一种可能,没有订阅者订阅某个主题,此时代理要知道如何处理这种情况。不同的代理软件有不同的处理机制。
为了保证层级主题的灵活性,认真设计主题层级树非常重要,要给未来的情况保留空间,遵循这个策略,MQTT会非常适合生产环境。

选择2:基于内容的过滤

在这种过滤类型中,代理(broker)使用过滤表达式,基于消息的内容进行过滤。订阅者通过订阅一个指定的过滤表达式来表明它们感兴趣的消息,代理基于消息内容将消息路由给合适的订阅者。

这种过滤模式,要根据具体的代理(broker)进行处理,不同的代理,处理方式可能不一样。

优点
  • 提供更多的控制粒度来接收消息。
  • 允许基于消息内容过滤,而不仅仅是主题层级。
  • 灵活,允许复杂的过滤表达式。
缺点
  • 和基于主题的过滤相比,使用起来更加复杂。
  • 发送者需要在消息中增加额外的元数据来支持过滤。
  • 处理大量筛选表达式时,性能可能会受影响。
用例

最适用于消息未按主题组织,且订阅者根据消息内容对特定消息子集感兴趣的场景。
比如,在物流应用中,订阅者只对包含某个指定单号的消息感兴趣,则该订阅者就会订阅一个过滤表达式,例如tracking-number='123456',代理(broker)就只会发送匹配这个表达式的消息给订阅者。

选择3:基于类型的过滤

该类型的过滤,代理(broker)通过消息的类型过滤消息。当和面向对象语言配合使用时,消息被当作对象呈现出来,这种过滤非常有用。订阅者通过订阅指定的消息类型来获取感兴趣的消息,代理(broker)根据消息类型路由给订阅者。

优点
  • 允许根据消息类型过滤,不关心消息的主题和内容。
  • 易用,特别是配合面向对象语言。
  • 更高的灵活性和扩展性。
缺点
  • 只能通过消息类型过滤
  • 发布者和订阅者需要提前约定消息类型的层级。
用例

基于类型的过滤,最适用于按类层级组织的消息和订阅者根据类,对指定的类型或子类型感兴趣的消息。
比如,在一个财务类应用中,订阅者只对股票价格类型的消息感兴趣,订阅者就会订阅“股票价格”类型的消息,代理(broker)则只会发送此类消息给订阅者。

这些过滤选项在决定将哪些消息发送给哪些订阅者时提供了灵活性和粒度。根据用例,可以使用这些过滤选项中的一个或多个来确保订阅者仅接收他们感兴趣的消息。
但是,需要注意的是,发布/订阅模型并不是适用于所有的情形,有一些情况需要考虑,比如,在使用基于主题的过滤时,需要确保发布和订阅双方知道使用哪一个主题。如何处理没有订阅者订阅消息。需要提前考虑待发布消息结构。

对基于主题的过滤,发布者和订阅者需要提前知道使用哪个主题。另外,对于消息发布,发布者不能假设有人在订阅这个消息,这是一个重要的点,因为在发布/订阅模型中,发布者将消息发布到代理(broker),并不知道订阅者是谁,也不知道订阅是否连接到代理(broker)。代理负责将消息发送给所有订阅该主题的订阅者。但是,如果没有该主题订阅者连接到代理(broker),则这消息永远都不会发送出去。因此,对于消息发布者来说,牢记消息发送是无法保证的,并进行相应的系统设计是至关重要的。

MQTT:发布/订阅的可扩展性

扩展性是发布/订阅架构的一个重要优点。传统的客户端-服务端模型在扩展性上存在局限,特别是在处理大量客户端的情况下。但是,在发布/订阅模型中,代理(broker)能够以事件驱动的方式处理消息,能够高并发操作,这就意味着系统可以在不恓性性能的情况下处理高并发。
另外,事件驱动处理中,消息缓存和智能消息路由也有助于提高发布/订阅的可扩展性。通过缓存消息,代理(broker)可以快速检索消息并将之发送给订阅者,而无需额外的处理。另一方面,智能路由确保消息只被发送给需要它们的订阅者,减少不必要的网络拥堵,使扩展性更佳。

MQTT遵循发布/订阅架构,很自然的具体扩展性,使之IoT应用场景的理想选择。尽管有这些优势,扩展到支持成千上万个连接依然是个挑战。在这种场景下,代理(broker)集群可以用来在多个服务器之间分配负载,负载均衡器可以确保流量均匀分布。

现在我们已经对发布/订阅架构的基本概念有了一个认识,接下来,我们看下使用它对IoT通信的好处。

MQTT发布/订阅架构在IoT和IIoT中的主要优势是什么

发布/订阅架构有几个优势,使之成为诸多应用的理想选择。这时列举一些主要优势:

  • 高可扩展性: 发布/订阅架构具有高扩展性,使之非常适合处理多客户端和多消息的应用。代理(broker)充当所有消息的中心枢纽,能够在不影响性能的情况下处理请多客户端。
  • 强容错性: 发布/订阅架构的解耦的特性同样提供了高容错性。在传统的客户端-服务端模型中,如果服务端下线,所有的客户端都会失去连接。相反,在发布/订阅架构中,代理(broker)可以存储消息,直接客户关重新连接,确认没有消息丢失。
  • 灵活性: 发布/订阅架构很灵活,可以用在各种应用中,从低带宽、高延迟的网络环境到高速、低延迟的网络环境,都可以。MQTT协议,基于发布/订阅构架,支持多个QoS等级,为应用提供了灵活的选择性。

发布/订阅架构常见挑战和使用MQTT如何客服这些挑战

尽管发布/订阅架构有诸多上述优点,但同样也有一些挑战必须处理,才能确保成功的应用。下面列的是一些常见的挑战及处理方法:

  1. 消息传递: 使用发布/订阅架构的一个挑战是确保消息发送给订阅者,在一些案例中,一些特定的主题没有订阅者,导致消息丢失。为了应用这个挑战,MQTT提供了QoS。
  2. 消息过滤: 发布/订阅架构的另一个挑战是有效的消息过滤,这样每个订阅者才能只接收自己感兴趣的消息。上文讨论过,发布/订阅架构提供了三种过滤选项:基于主题、基于内容和基于类型。每个类型都有其优点和缺点,要结合自己的应用场景进行选择。MQTT使用基于主题的方式过滤消息,每个消息都包含一个主题,代理(broker)基于此来确定订阅者是否接收该消息。
  3. 安全: 在任何消息处理系统中,安全都是一个非常重要的方面,发布/订阅架构也不例外。MQTT允许提供了几种安全选项,比如用户认证、接入控制和消息加密,以保护系统免受未经授权的访问和数据泄漏。
  4. 扩展性: 发布/订阅架构的设计必须牢记扩展性,因为在一个大系统中订阅者数量会呈指数级增长。MQTT提供了一些功能,比如多代理结点、集群和负载均衡等来保证系统能够处理大量的订阅者和消息。
  5. 消息排序: 在发布/订阅系统中,消息排序可能难以维护,因为消息是异步发送的,保证订阅都按照正确的顺序收到消息有一定的困难。但是,MQTT提供了QoS来确保消息成功的从客户端发送到代理,或从代理发送到客户端。

因为MQTT是异步工作的,因此在等待或发布消息是不会阻塞任务。大多数客户端库都基于回调或类似的模型,因此消息流通常是异步的。在一些案例中,同步是可取的也是可能的。一些库有同步API来等待指定的消息。

  1. **实时约束:**在一些案例中,要求严格的实时性,则发布/订阅架构就不是最好的选择。如果低延迟非常关键,则请求-响应模型架构是一个更好的选择。

你可以通过完备的设计和实现来解决使用发布/订阅架构中的挑战。开发人员理解了挑战,可以构建出可扩展、安全、高效的消息系统,有效的利用MQTT的功能。

MQTT VS 消息队列

关于MQTT,有很多疑惑,该协议是否是消息队列的一个实现,这里会阐明该主题并解释其中的差异。在前一篇文章(http://t.csdnimg.cn/HhjzK)中,提到MQTT指的是IBM的MQ系统产品,与“消息队列”无关。无论名字的由来,了解MQTT和传统消息队列之间的区别都很有用:

  • 一个消息队列存储消息,直到该消息被消费掉。 当你使用消息队列时,每条消息都被存储到队列直接被一个客户端(消费者)接收,如果没有客户端接收该消息,该消息则就停留在队列中,等待被消费。在一个消息队列中,一条消息不被任何客户端接收,是不可能的。
  • 一个消息仅被一个客户端消息。 另一个在的不同点就是在传统的消息队列中,一条消息仅能被一个客户端消费,负载在队列的所有使用者之间分配。在MQTT中,该行为正好相反:每个订阅了该主题的订阅者都可以获取消息。
  • 队列有名称且必须被明确的创建。 队列比主题要严格很多。在一个队列可以使用之前,该队列必须使用单独的命令显式创建。只有队列被命名和创建之后,才有可能发布或消费消息。相反,MQTT主题就非常灵活,可以随时创建。
    如果还有其他不同点,可以在评论里交流。

总结

发布/订阅架构提供了一个灵活、可扩展的方式来构建分布式系统,可以处理许多的客户端连接。MQTT的轻是级和高效的发布/订阅消息特性帮助它在IoT、移动和其他分布式应用程序得到广泛应用。

使用MQTT,架构师和公司可以构建系统,在各种实际场景中可靠、高效地传输数据。通过其空间和时间上的解耦、异步消息、基于主题的过滤和QoS等级等特性,MQTT提供了一组强大的功能来帮助开发人员克服构建分布式系统的挑战。总之,发布/订阅架构和MQTT协议是想要开发高效、可扩展分布式系统开发人员的有效工具。

在后续章节中,将会近距离的探究MQTT客户端和代理(broker)的构建及两者之间如何连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/202502.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Gitee-PicGo-Typora

Gitee-PicGo-Typora 问题引出 问题1:根据相关法律法规和政策,您的部分文件因存在敏感信息而无法显示 就在昨晚, 我在记笔记的时候,发现之前配置的七牛云图床出了问题: 1、根据相关法律法规和政策,您的部…

RabbitMQ消息模型之Routing-Topic

Routing Topic Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key的时候使用通配符!这种模型Routingkey一般都是由一个或多个单词组成,多个单词之间以”…

Mysql安全之基础合规

一、背景 某次某平台进行安全性符合型评估时,列出了数据库相关安全选项,本文特对此记录,以供备忘参考。 二、安全配置 2.1、数据库系统登录时的用户进行身份标识和鉴别; 1)对登录Mysql系统用户的密码复杂度是否有要…

Stream API练习题

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 考虑到Stream API在实际…

2023-11-30 事业-代号s-资质-香港公司-带注册服务商-盛森国际-分析

摘要: 基于合法避税及其他因素,考虑在香港注册公司. 选择的服务商为盛森国际,对该公司做彻底的背调和服务分析, 以规避潜在的风险. 并分析该公司在香港代注册的服务商中的行业竞争力, 以保证其服务的质量及成本的控制. 盛森国际官方资料: 官网: 注册香港…

Nuxt.js:下一代Web开发框架的革命性力量

文章目录 一、Nuxt.js简介二、Nuxt.js的特点1. 集成Vue.js和Node.js2. 自动代码分割和优化3. 服务端渲染(SSR)4. 强大的路由管理5. 丰富的插件系统 三、Nuxt.js的优势1. 提高开发效率2. 降低维护成本3. 提高用户体验 四、Nuxt.js在实际应用中的案例1. 电…

YOLOv5独家原创改进:自研独家创新FT_Conv,卷积高效结合傅里叶分数阶变换

💡💡💡本文自研创新改进:卷积如何有效地和频域结合,引入分数阶傅里叶变换(FrFT)和分数阶Gabor变换(FrGT),最终创新到YOLOv5。 使用方法:1)直接替换原来的C2f;2)放在backbone SPPF后使用;等 推荐指数:五星 在道路缺陷检测任务中,原始map为0.8,FT_Conv为0.82 …

linux用户组_创建_删除_修改

2.2.2 用户组 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。 组的类型: 基本组&#x…

基于STM32+定时器中断和定时器外部时钟(标准库函数讲解)

前言 本篇博客主要学习了解定时器的标准库函数,以及定时器中断进行LED灯的反转,还有定时器外部时钟获取脉冲计数功能。本篇博客大部分是自己收集和整理,如有侵权请联系我删除。 本篇博客主要是对通用定时器来讲解,功能适中比较常…

判断数组中每个元素是否为负数 numpy.signbit()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 判断数组中每个元素是否为负数 numpy.signbit() [太阳]选择题 请问以下代码中最后输出结果是? import numpy as np a np.array([-1, 0, 1]) print("【显示】a ",a) pr…

智能优化算法应用:基于帝国主义竞争算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于帝国主义竞争算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于帝国主义竞争算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.帝国主义竞争算法4.实验参数设定5.算…

运维知识点-PostgreSql

PostgreSql 下载安装地址安装组件数据目录设置superuser密码 端口安装语言安装完成,是否安装Stack Builder 下载 https://www.postgresql.org/download/windows/ https://get.enterprisedb.com/postgresql/postgresql-13.7-1-windows-x64.exe 我下载的 13.7 安装…

【MySQL数据库】SQL查询语句总结

目录 一、查询数据 1.1 基本查询语句 1.2 表单查询 1.3 WHERE子句 1.3.1 IN关键字查询 1.3.2 Between查询范围 1.3.3 Like匹配查询 1.3.4 AND多条件查询(等同于&&) 1.3.5 OR多条件查询(等同于||) 1.3.6 LIMIT子句 1.3.7 对…

基于Java SSM框架实现母婴儿用品网站系统项目【项目源码+论文说明】

基于java的SSM框架实现母婴儿用品网站系统演示 摘要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 母婴用品网站,主要的模块包括管理员;主页、个人中心、用户管理、商品分…

架构图是什么,该怎么制作?

架构图是指可视化展示软件、系统、应用程序、网络等各种体系结构的一类图表或图形,它能够形象地展示体系结构中各个组成部分和它们之间的关系。 架构图的类型 架构图的种类比较多,逐一列举不太合适,这里只列举一些常见的架构图类型&#…

Oracle E-Business Suite软件 任意文件上传漏洞(CVE-2022-21587)

0x01 产品简介 Oracle E-Business Suite(电子商务套件)是美国甲骨文(Oracle)公司的一套全面集成式的全球业务管理软件。该软件提供了客户关系管理、服务管理、财务管理等功能。 0x02 漏洞概述 Oracle E-Business Suite 的 Oracle…

LeetCode刷题---斐波那契数列模型

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、第N个泰波那契数 题目链接:1137. 第 N 个泰波那契数 题目描述 泰波那契序列Tn定义如下: T00,T11,T2 1,且在n&g…

2023.11.30 homework

兴趣最重要了,没兴趣不喜欢勉强带来的苦楚,并不能促使变好变优秀。 虽然我们的社会环境依旧很残酷,各种各样的硬性要求。

Docker + Jenkins + Nginx实现前端自动化部署

目录 前言一、前期准备工作1、示例环境2、安装docker3、安装Docker Compose4、安装Git5、安装Nginx和Jenkinsnginx.confdocker-compose.yml 6、启动环境7、验证Nginx8、验证Jenkins 二、Jenkins 自动化部署配置1、设置中文2、安装Publish Over SSH、NodeJS(1&#x…

PC端数据列表有头像显示头像,没有头像显示名字的第一个字

PC端数据列表有头像显示头像&#xff0c;没有头像显示名字的第一个字 .charAt(0) 是 JavaScript 字符串对象的方法&#xff0c;用于获取字符串的第一个字符。 字符串中的字符位置是从 0 开始的&#xff0c;所以.charAt(0) 就表示获取字符串的第一个字符。 <el-table ref&qu…