目录
[一、 spring的配置文件的哪四处?](#一、 spring的配置文件的哪四处?)
[1.数据源(Data Source)配置](#1.数据源(Data Source)配置)
[2.事务管理器(Transaction Manager)配置](#2.事务管理器(Transaction Manager)配置)
[3. 扫描组件(Component Scanning)配置](#3. 扫描组件(Component Scanning)配置)
[4. AOP(面向切面编程)配置(如果需要)](#4. AOP(面向切面编程)配置(如果需要))
[二、 start启动器的原理](#二、 start启动器的原理)
[2. 启动器的工作原理 - 依赖管理方面](#2. 启动器的工作原理 - 依赖管理方面)
[3.启动器的工作原理 - 自动配置方面](#3.启动器的工作原理 - 自动配置方面)
[三、 InnoDB 的b+树和 MyISAM 的b+树的区别?](#三、 InnoDB 的b+树和 MyISAM 的b+树的区别?)
[InnoDB 的 B + 树特点](#InnoDB 的 B + 树特点)
[MyISAM 的 B + 树特点](#MyISAM 的 B + 树特点)
[四、 读写分离的情况下怎么保证数据的一致性?](#四、 读写分离的情况下怎么保证数据的一致性?)
[1.HTTP/HTTPS 协议](#1.HTTP/HTTPS 协议)
[2.TCP/IP 协议](#2.TCP/IP 协议)
[3.UDP 协议](#3.UDP 协议)
[4.Websocket 协议](#4.Websocket 协议)
[5.MQTT 协议(消息队列遥测传输协议)](#5.MQTT 协议(消息队列遥测传输协议))
一、 spring的配置文件的哪四处?
1.数据源(Data Source)配置
作用:在 Spring 应用中,数据源配置是连接数据库的关键部分。它定义了应用程序如何与数据库进行通信,包括数据库的 URL、用户名、密码等信息。
-
示例(以 XML 配置为例) :
XML<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mydb"/> <property name="username" value="root"/> <property name="password" value="password"/> </bean>
-
解释 :
- 首先定义了一个
id
为dataSource
的bean
,它的类是DriverManagerDataSource
,这是 Spring 提供的一个简单的数据源实现。 property
标签用于设置数据源的属性。driverClassName
指定了数据库驱动的类名,这里是 MySQL 的驱动。url
定义了数据库的连接地址,包括主机名(localhost
)、端口号(3306
)和数据库名称(mydb
)。username
和password
分别是连接数据库所需的用户名和密码
- 首先定义了一个
2.事务管理器(Transaction Manager)配置
作用:事务管理对于保证数据的一致性和完整性至关重要。Spring 的事务管理器配置定义了如何管理事务,包括事务的传播行为、隔离级别等。
示例(以 XML 配置为例):
XML
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
解释:
定义了一个id
为transactionManager
的bean
,其类是DataSourceTransactionManager
,这是用于 JDBC 数据源的事务管理器。
- 通过
property
标签的ref
属性将之前定义的dataSource
注入到事务管理器中,使得事务管理器能够使用这个数据源来管理事务。
3. 扫描组件(Component Scanning)配置
作用 :Spring 通过组件扫描来自动发现和注册应用中的组件 ,如**@Service
、@Repository
、@Controller
等标注的类** 。这大大简化了对象的创建和管理过程。
示例(以 XML 配置为例):
XML
<context:component - scan base - package="com.example.myapp"/>
解释:
context:component - scan
标签告诉 Spring 从com.example.myapp
这个基础包 及其子包中扫描组件 。这样,Spring 会自动创建和管理这些组件 ,例如,将带有@Service
注解的类作为服务层组件进行管理,将带有@Repository
注解的类作为数据访问层组件进行管理。
4. AOP(面向切面编程)配置(如果需要)
作用:AOP 用于实现横切关注点的分离,如日志记录、安全检查等。通过 AOP 配置,可以定义切面、切点和通知,将这些横切关注点从业务逻辑中分离出来,提高代码的可维护性和复用性。
示例(以 XML 配置为例):
XML
<aop:config>
<aop:pointcut id="businessService" expression="execution(* com.example.myapp.service.*.*(..))"/>
<aop:aspect id="loggingAspect" ref="loggingAspectBean">
<aop:before pointcut - ref="businessService" method="logBefore"/>
</aop:aspect>
</aop:config>
解释:
aop:config
标签是 AOP 配置的根标签。aop:pointcut
定义了一个切点,id
为businessService
,expression
属性中的表达式execution(* com.example.myapp.service.*.*(..))
表示匹配com.example.myapp.service
包下所有类的所有方法。aop:aspect
定义了一个切面,id
为loggingAspect
,ref
属性指向一个切面实现的bean
(这里假设是loggingAspectBean
)。aop:before
标签定义了一个前置通知,它会在匹配切点(pointcut - ref="businessService"
)的方法执行之前调用logBefore
方法,这个方法通常用于记录日志等操作。
二、 start启动器的原理
1.什么是启动器(Starter)
在 Spring Boot 项目中,启动器是一组依赖的集合,它能够帮助开发者快速搭建特定功能的开发环境。例如,spring - boot - starter - web
启动器可以让开发者很方便地构建一个基于 Spring 的 Web 应用程序。启动器本质上是一种约定大于配置的工具,它隐藏了大量复杂的配置细节,让开发者可以专注于业务逻辑的实现。
2. 启动器的工作原理 - 依赖管理方面
自动依赖引入 :启动器利用了 Maven 或 Gradle 等构建工具的依赖传递特性。以 Maven 为例,当在项目的pom.xml
文件中添加一个启动器依赖(如spring - boot - starter - web
)时,这个启动器本身会依赖一系列其他的库。
例如,
spring - boot - starter - web
依赖于spring - webmvc
(用于实现 Spring 的 MVC 框架)、tomcat - embed - core
(用于在应用内部嵌入 Tomcat 服务器)等众多库。这些依赖关系是预先定义好的,当添加启动器时,构建工具会自动下载并管理这些相关的依赖。
版本兼容性管理 :Spring Boot 启动器还负责管理依赖的版本。Spring Boot 团队维护了一套经过测试的、相互兼容的依赖版本。例如,在spring - boot - dependencies
这个父 POM(在 Maven 中)中,规定了各个库的版本号。当使用启动器时,它所依赖的各个库会按照这个预定义的版本号进行下载和使用,避免了因版本冲突导致的各种问题。
3.启动器的工作原理 - 自动配置方面
条件注解(Conditional Annotations)的应用 :Spring Boot 启动器通过条件注解来判断是否需要进行某些配置。例如,@ConditionalOnClass
注解用于检查特定的类是否存在于类路径中。如果在项目的类路径中存在org.springframework.web.servlet.DispatcherServlet
(这是 Spring MVC 的核心类),那么与 Spring MVC 相关的配置就会被启用。这样可以根据项目中实际引入的类来动态地配置应用,避免不必要的配置加载。
自动配置类(Auto - configuration Classes)的加载和应用 :每个启动器通常都包含一个或多个自动配置类 。这些自动配置类会在应用启动时被加载(通过 Spring Boot 的自动配置机制)。以spring - boot - starter - web
为例,其中的自动配置类会自动配置 Spring MVC 相关的组件,如视图解析器、消息转换器等 。这些自动配置类会根据默认的配置规则或者应用的属性(可以通过application.properties
或application.yml
文件设置)来设置组件的属性。例如,自动配置类会根据应用的配置来确定视图解析器应该解析哪些视图文件类型(如.jsp
、.html
等)。
属性绑定(Property Binding) :启动器还支持属性绑定功能。开发者可以在application.properties
或application.yml
文件中设置与启动器相关的属性。例如,对于spring - boot - starter - web
,可以设置服务器端口(server.port
)、上下文路径(server.servlet.context - path
)等属性。这些属性会被自动绑定到相应的配置类或组件上。例如,当设置server.port = 8081
时,应用启动时会将嵌入式服务器(如 Tomcat)的端口设置为 8081。
三、 InnoDB 的b+树和 MyISAM的b+树的区别?
InnoDB 的 B + 树特点
1.存储结构与数据组织方式
索引存储 :在 InnoDB 存储引擎中,数据是存储在 B + 树的叶子节点中的 。非叶子节点只存储索引信息,用于引导搜索路径找到叶子节点 。例如,对于一个以主键为索引的表,主键的值会按照顺序存储在 B + 树的叶子节点上。并且叶子节点之间通过双向链表相连 ,这使得范围查询(如查询主键值在某个区间内的所有记录)非常高效。可以从链表的一端开始,顺序扫描叶子节点,获取满足条件的所有记录。
数据存储 :InnoDB 采用 聚集索引(Clustered Index)的方式,即如果表有主键 ,那么主键索引的叶子节点存储的是整行数据 。如果没有主键,会选择一个唯一键作为聚集索引 ;如果没有唯一键,InnoDB 会自动生成一个隐藏的主键 。这种存储方式使得通过主键访问数据时,只需要一次 B + 树的查找就能获取到完整的行数据。
2.适用场景与性能优势
事务处理与数据完整性支持 :InnoDB 是为事务处理(ACID 特性)设计的存储引擎。B + 树结构在这种环境下表现出色,因为它能够很好地支持插入、更新和删除操作,同时保证数据的一致性 。在高并发的事务操作环境下,如银行系统中的账户交易记录存储、电商系统中的订单处理等,InnoDB 的 B + 树索引可以高效地处理大量的读写操作。
例如:
在执行一个复杂的事务,涉及多个表的关联查询和数据更新时,InnoDB 能够利用 B + 树索引快速定位相关数据,并通过事务机制保证操作的完整性。
磁盘 I/O 优化 :由于 B + 树的高度相对较低(通常为 3 - 4 层,具体取决于数据量和索引大小 ),在查询数据时,能够减少磁盘 I/O 次数 。叶子节点的顺序存储 和链表连接方式 也有利于预读操作。数据库系统可以根据磁盘的读取特性,一次读取多个相邻的叶子节点数据,提高查询效率。这种磁盘 I/O 的优化在处理大量数据时效果尤为明显,例如在大型数据库应用中,存储海量用户信息或者商品数据时,InnoDB 的 B + 树索引可以减少磁盘寻道时间,加快数据访问速度。
MyISAM 的 B + 树特点
1.存储结构与数据组织方式
索引存储 :MyISAM 存储引擎也使用 B + 树来构建索引,但与 InnoDB 不同的是,MyISAM 的 数据文件和索引文件是分开存储的 。索引文件中的 B + 树叶子节点存储的是 指向数据文件中对应记录的物理地址(如文件偏移量)。
例如,当通过索引查找一条记录时:
首先在索引 B + 树中找到叶子节点,获取记录的物理地址,然后再去数据文件中根据这个地址读取实际的数据。
数据存储 :MyISAM 的数据文件存储了表中的实际数据 ,数据按照插入的顺序存储 ,没有像 InnoDB 那样的聚集索引概念。这使得 MyISAM 在存储一些非关键业务数据或者对数据存储顺序没有严格要求的场景下比较方便。
例如:
在一些简单的日志存储系统或者临时数据存储场景中,MyISAM 可以快速地插入数据,而不需要考虑数据的聚集存储方式。
2.适用场景与性能优势
查询性能优势 :MyISAM 的 B + 树索引在一些特定的查询场景下具有性能优势。特别是对于读密集型的应用,尤其是只有单表查询或者简单的多表关联查询(没有复杂的事务处理和数据一致性要求)时,MyISAM 能够快速地定位数据。因为索引和数据的分离存储,使得在某些情况下,查询索引的速度可能更快。例如,在一个以读为主的新闻网站内容管理系统中,对于文章内容的查询,MyISAM 可以利用 B + 树索引快速找到文章的物理存储位置,进而读取文章内容。
空间利用与存储灵活性 :MyISAM 在空间利用上有一定的灵活性。由于数据和索引分开存储,在某些情况下可以更好地管理数据文件和索引文件的大小。例如,当数据需要频繁更新,但索引相对稳定时,可以只对数据文件进行操作,而不需要频繁地修改索引文件,这样可以减少索引维护的开销。同时,对于一些对存储空间比较敏感的应用,MyISAM 可以通过一些特定的存储参数设置,如压缩数据文件等方式,来节省存储空间。
两者的主要区别总结
- 数据存储方式:
- InnoDB 采用聚集索引,数据存储在主键索引的叶子节点中;
- MyISAM 的数据和索引是分开存储的,索引叶子节点存储数据的物理地址。
- 事务支持:
- InnoDB 是支持事务 处理的存储引擎,能够保证数据的ACID 特性;
- MyISAM 不支持事务 处理,适用于对事务要求不高的简单查询场景。
- 索引结构对性能的影响:
- InnoDB 的 B + 树在高并发事务环境和需要数据完整性保证的场景下表现出色,其叶子节点的链表结构有利于范围查询;
- MyISAM 的 B + 树在以读为主的简单查询场景下效率较高,索引和数据分离存储在某些情况下可以提供更快的查询速度。
- 空间利用和存储管理:
- MyISAM 在空间利用上相对灵活 ,可以单独管理数据文件和索引文件的大小;
- InnoDB 由于聚集索引的存在,数据存储相对紧密,但在频繁更新数据时可能需要更多的索引维护操作。
四、 读写分离的情况下怎么保证数据的一致性?
1.读写分离架构概述
在读写分离架构中,数据库系统将读操作和写操作 分布到不同的数据库节点 (主库和从库)上。主库负责处理所有的写操作(如插入、更新、删除),从库负责处理读操作 。这种架构可以有效提升系统的性能和扩展性,因为读操作通常是频繁的,通过多个从库分担读负载 ,可以更好地应对高并发的读请求。然而,这种架构可能会导致**数据一致性问题,**因为数据的更新是在主库进行,而从库的数据更新有一定延迟。
2.基于数据同步机制保证一致性
1.异步复制与延迟监控
异步复制原理 :在主从复制中,最常见的是异步复制方式 。主库在执行完写操作后,会将操作记录到二进制日志(Binlog)中,然后通过网络将Binlog 发送给从库 。从库有一个I/O 线程 ,它会接收并将 Binlog 写入本地的中继日志(Relay Log ),然后另一个 SQL 执行线程会从中继日志中读取操作记录并执行,从而实现数据的复制。这种方式的优点是主库的写操作不会因为从库的复制而阻塞,性能较好。
延迟监控与处理 :为了监控主从复制的延迟情况,可以通过数据库系统提供的工具 或者自定义脚本进行。
- 例如:
在 MySQL 中,可以使用
SHOW SLAVE STATUS
命令来查看从库的状态 ,其中Seconds_Behind_Master
字段表示从库落后主库的秒数。当延迟超过一定阈值时,可以采取相应的措施,如暂停部分读操作,将读请求路由到主库,或者发出警报通知管理员进行处理。
2.半同步复制的应用
半同步复制机制 :半同步复制是一种介于异步复制 和同步复制之间的方式 。在半同步复制模式下,**主库在执行完写操作后,会等待至少一个从库确认已经接收到并写入了中继日志后,才返回写操作成功的消息。**这样可以在一定程度上保证数据的一致性,因为主库可以确保至少有一个从库已经接收到了最新的写操作记录。
性能与一致性的平衡 :不过,半同步复制会对主库的性能产生一定的影响 ,因为它需要等待从库的确认。在高并发的写操作场景下,可能会导致主库的响应时间延长。因此,需要根据业务对数据一致性的要求和系统的性能需求来合理设置半同步复制的参数。例如,可以设置等待从库确认的超时时间,当超时后,主库可以自动切换回异步复制模式,以避免长时间等待影响性能。
3.应用层控制保证一致性
1.读写分离中间件的使用与配置
中间件功能介绍 :读写分离中间件(如 MyCat、Sharding - JDBC 等)在系统中起到了关键的作用。它可以根据 SQL 语句的类型 (读或写)自动将请求路由到主库或者从库。同时,一些高级的中间件还提供了数据一致性的控制功能。例如,它们可以在事务开始时,将所有相关的读操作也路由到主库,直到事务结束,这样可以保证在事务内部数据的一致性。
一致性策略配置:可以通过中间件的配置来设置数据一致性策略。例如,设置在某些关键业务场景下(如涉及资金交易、订单状态变更等),优先使用主库进行读操作,或者设置当从库延迟超过一定限度时,全部读操作切换到主库。这些策略可以根据业务的重要性和对数据一致性的敏感程度来灵活调整。
2.业务逻辑层的补偿机制
记录操作日志与补偿操作设计:在业务逻辑层,可以设计操作日志记录机制。当在主库执行写操作时,同时记录详细的操作日志,包括操作类型、操作时间、涉及的数据等。如果发现从库的数据与主库不一致,可以根据操作日志进行补偿操作。例如,如果是一个商品库存的更新操作,在主库更新库存后,记录库存更新的日志。当发现从库库存数据不一致时,可以根据日志重新执行库存更新操作来修复数据。
最终一致性的实现:这种方式通常是基于最终一致性的原则,即允许系统在短时间内存在数据不一致的情况,但通过一定的机制和时间,最终使数据达到一致。例如,在一个社交网络系统中,用户发布了一条动态,主库更新了动态数据后,从库可能会有短暂延迟。但在用户查看动态或者系统进行数据同步操作后,从库的数据会最终与主库一致。
五、项目中有哪些通信协议
1.HTTP/HTTPS 协议
定义与应用场景
HTTP (超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是万维网数据通信的基础,主要用于客户端(如浏览器)和服务器之间传输网页等资源。例如,当你在浏览器中输入一个网址时,浏览器就会通过 HTTP 协议向服务器请求对应的网页内容,服务器将网页数据发送回浏览器,浏览器再进行解析和显示。HTTPS 是 HTTP 的安全版本,它在 HTTP 的基础上加入了 SSL/TLS 加密层,用于保护数据传输的安全性。在涉及用户登录、金融交易、个人隐私信息传输等场景中广泛应用,如网上银行转账、电商平台的用户登录和支付等操作。
工作原理
请求 - 响应模型 :HTTP 采用请求 - 响应的通信模式。 客户端发送一个请求消息给服务器 ,请求消息包括请求行(包含请求方法,如 GET、POST 等,请求的 URL 和 HTTP 协议版本)、请求头(包含各种请求相关的信息,如用户代理、接受的内容类型等)和请求体(在某些请求方法下包含要发送的数据,如 POST 请求中的表单数据)。服务器收到请求后 ,根据请求的内容进行处理,然后返回一个响应消息 。响应消息包括响应行 (包含 HTTP 协议版本、响应状态码,如 200 表示成功、404 表示未找到资源等)、响应头 (包含服务器信息、内容类型、内容长度等)和响应体(包含实际要返回给客户端的数据,如网页内容、文件数据等)。
无状态性 :HTTP 是无状态的协议,这意味着服务器不会记住客户端的状态信息 。每次请求都是独立的,服务器不会因为之前的请求而对当前请求有特殊的处理。例如,在一个电商网站中,用户添加商品到购物车的请求和结算购物车的请求是相互独立的,服务器不会自动知道这两个请求来自同一个用户的购物流程,通常需要通过使用 Cookie 或 Session等技术来维护用户的状态。
2.TCP/IP 协议
定义与应用场景
TCP/IP(传输控制协议 / 互联网协议)是一组用于网络通信的协议族 。其中,IP 协议负责在网络中路由和寻址,将数据包从源地址发送到目标地址。 TCP 协议则是一种**面向连接的、可靠的传输层协议,用于保证数据的可靠传输。**它在很多需要稳定、可靠数据传输的场景中广泛应用,如文件传输(FTP 使用 TCP 协议)、电子邮件传输(SMTP 和 POP3/IMAP 协议在传输层通常基于 TCP)、远程登录(如 SSH 协议)等。
例如 : 当你使用 FTP 从服务器下载文件时,TCP 协议会确保文件数据准确无误地从服务器传输到你的本地计算机。
工作原理
三次握手建立连接 :在 TCP 通信开始前,需要通过三次握手来建立连接 。首先,客户端发送一个带有 SYN(同步序列号)标志的数据包给服务器 ,表示请求建立连接 ,同时包含一个初始序列号 。服务器收到后 ,返回一个带有 SYN 和 ACK(确认)标志的数据包,确认收到客户端的请求,并也发送自己的一个初始序列号 。最后,客户端再发送一个带有 ACK 标志的数据包给服务器,确认收到服务器的序列号,这样连接就建立成功。
这个过程可以类比为打电话时,先拨通号码(第一次握手),对方接听并回应(第二次握手),然后你再确认听到对方的回应(第三次握手)。
可靠的数据传输机制 :TCP 通过序列号和确认应答机制来保证数据的可靠传输 。发送方将数据分割成一个个数据包 ,并为每个数据包标记一个序列号 。接收方收到数据包后,会返回一个确认应答,告诉发送方已经收到了哪些数据包。如果发送方在一定时间内没有收到确认应答,就会重新发送丢失的数据包 。同时,TCP 还通过滑动窗口机制来控制发送方的发送速度,根据接收方的接收能力和网络状况来调整数据发送量,以避免网络拥塞。
3.UDP 协议
定义与应用场景
UDP(用户 Datagram 协议)是一种无连接的传输层协议。 它不像 TCP 那样提供可靠的数据传输服务,没有握手过程,也不保证数据包的顺序和是否到达目的地。但UDP 具有传输速度快、开销小的特点 ,适用于一些对实时性要求较高但对数据准确性要求相对较低的场景,如视频直播、音频通话、网络游戏等。
例如,在视频直播中,少量的数据丢失对于观众的观看体验影响不大,而实时性更为重要,UDP 可以快速地将视频数据发送出去,减少延迟。
工作原理
数据报传输方式 :UDP 以数据报(Datagram)的形式发送数据。发送方将数据封装成 UDP 数据报 ,其中包括源端口、目标端口、数据长度和数据内容等信息,然后直接发送给目标地址 。接收方收到数据报后,直接进行处理。由于没有像 TCP 那样的连接建立和数据确认机制,UDP 发送数据的速度更快,但也更容易出现数据丢失、重复或乱序的情况。例如,在一个网络游戏中,玩家的操作指令通过 UDP 发送,偶尔的指令丢失可能会导致玩家角色的动作稍微卡顿,但不会严重影响游戏的整体进行。
4.Websocket 协议
定义与应用场景
Websocket是一种在单个 TCP 连接上进行全双工通信的协议。 它主要用于实现浏览器 和服务器 之间的实时通信 。在传统的 HTTP 通信中,客户端和服务器之间的交互是请求 - 响应式的,服务器不能主动向客户端推送信息 。而 Websocket 改变了这种模式,使得服务器可以随时向客户端发送数据,客户端也可以随时向服务器发送数据。
广泛应用于在线聊天、实时数据监控、股票行情推送等需要实时交互的场景。例如,在一个在线股票交易平台中,Websocket 可以用于实时推送股票价格的变化,让用户能够及时获取最新信息。
工作原理
握手过程与协议升级 :Websocket 通信开始时,客户端通过发送一个 HTTP 请求来进行握手 ,请求头中包含特殊的字段,表示要升级协议为 Websocket。服务器收到请求后,如果支持 Websocket 协议,会返回一个响应 ,完成协议的升级 。之后,双方就可以在这个 TCP 连接上进行全双工的通信。 通信过程中,数据以帧(Frame) 的形式发送,帧有多种类型,包括文本帧、二进制帧等,用于传递不同类型的数据。 例如,在一个在线聊天应用中,用户发送的聊天消息可以作为文本帧 通过Websocket 连接 发送 给服务器 ,服务器再转发给其他用户。
5.MQTT 协议(消息队列遥测传输协议)
定义与应用场景
MQTT是一种轻量级的、基于发布 - 订阅模式的消息传输协议。 它专为物联网设备之间的通信而设计,适用于网络带宽有限、设备资源有限的环境。例如,在智能家居系统中,各种传感器(如温度传感器、湿度传感器等)可以通过 MQTT 协议将采集到的数据发送到服务器或者其他设备上,同时,控制设备(如智能插座、智能灯等)也可以接收服务器通过 MQTT 发布的控制命令。
工作原理
发布 - 订阅模式 :在 MQTT 协议中,消息的发送者(发布者)将消息发布到特定的主题(Topic)上,而消息的接收者(订阅者)订阅感兴趣的主题。当有消息发布到订阅者感兴趣的主题时,消息就会被传递给订阅者。例如,在一个智能农业系统中,土壤湿度传感器作为发布者将湿度数据发布到 "soil_moisture" 主题上,灌溉系统作为订阅者订阅了这个主题,当湿度数据低于一定阈值时,灌溉系统就会收到消息并启动灌溉。
消息质量等级:MQTT 协议支持不同的消息质量等级(QoS)。QoS 0 表示最多一次传递,消息可能会丢失;QoS 1 表示至少一次传递,消息可能会重复;QoS 2 表示只有一次传递,保证消息既不丢失也不重复。这种机制可以根据不同的应用场景和设备性能来灵活选择消息传递的可靠性。例如,对于一些不太重要的数据,如环境监测中的一些辅助参数,可以使用 QoS 0 来节省网络资源;而对于重要的控制命令,如智能家居中的电器开关命令,可以使用 QoS 2 来确保准确性。