【转载翻译】消息队列 - ActiveMQ、RabbitMQ、Kafka、ZeroMQ

转载自本人博客:【转载翻译】消息队列 - ActiveMQ、RabbitMQ、Kafka、ZeroMQ

转载自:The System Design Cheat Sheet: Message Queues - ActiveMQ, RabbitMQ, Kafka, ZeroMQ

本文由 Aleksandr Gavrilenko 发布于2023年12月21日

1. 前言

消息队列是异步服务到服务通信的一种形式。它们对于增强系统的可扩展性、可靠性和可维护性非常重要。

主要功能包括:

  1. 异步通信:允许系统的不同部分进行通信,而无需立即响应,从而更有效地使用资源。
  2. 服务解耦:使服务能够独立运行,降低系统的复杂度,增强可维护性和可扩展性。
  3. 负载均衡:将消息均匀分布在不同的服务或工作线程之间,有助于管理工作负载并提高系统性能。
  4. 有序保留:某些消息队列可以确保消息按照发送顺序进行处理,这对于特定应用程序至关重要。
  5. 可扩展性:通过添加更多使用者或资源来处理增加的消息流,从而促进应用程序的轻松扩展。
  6. 速率限制:控制消息处理的速率,这对于管理资源和防止系统过载非常重要。
  7. 扇出功能:消息队列通常包含扇出机制,该机制允许将单个消息同时传递给多个使用者或服务。
  8. 数据持久性:提供将消息存储在磁盘或内存中的能力,直到它们被成功处理,确保在系统故障的情况下数据不会丢失。
  9. **消息过滤和路由:**允许根据特定条件或内容路由或过滤消息,从而实现更有针对性和更高效的处理。

2. 组件

对于消息队列的内容,核心的概念是生产者(Producer)消费者(Consumer)消息(Message)

  1. 生产者(Producer) 是一个应用程序或服务,负责创建消息并将其发送到消息队列。它不需要知道谁将处理消息或何时处理消息。
  2. **消费者(Consumer)**是从队列中检索和处理消息的应用程序或服务。它作用于生产者发送的数据。
  3. **消息(Message)**是从生产者发送到消费者的数据包。它们的大小和格式可能有所不同,范围从简单的文本字符串到复杂的数据结构(如 JSON 或 XML)。
  4. 消息代理(Message Broker) 是一个中间件工具,它通过接收来自发送方的消息并将其路由到适当的接收方,从而促进不同应用程序或服务之间的通信。它通常提供消息队列、路由、转换和传递保证等功能。

3. 消息传递模型

3.1 两种通用消息传递模型

总的来说,有两种类型的消息传递:点对点消息传递和发布-订阅消息传递。

3.1.1 点对点(Point-to-Point)

  • 生产者发送的消息被放置在队列(Queue)中,并由单个使用者使用。
  • 它确保每条消息仅由一个接收者处理一次。
3.1.2 发布-订阅(Publish-Subscribe)

  • 消息将发布到特定主题(Topic),而不是队列,不仅给单个使用者使用。
  • 多个消费者可以订阅一个主题,并接收广播到该主题的消息。

3.2 额外消息交换模式

但是,某些消息传递协议和支持它们的代理使用额外的交换(Exchange)组件进行路由。在这种情况下,消息将首先发布到代理中的交换模块。Exchange 充当路由代理,使用其路由规则将这些消息转发到相应的队列。

区分了以下交换模式:

3.2.1 直接交换(Direct exchange)

  • 消息被路由到其绑定键与消息的路由键匹配的队列。
3.2.2 话题交换(Topic exchange)

  • 主题交换将在路由键和绑定中指定的路由模式之间执行通配符匹配,以将消息发布到队列。
3.2.3 扇出交换(Fanout exchange)

  • 发送到扇出交换的消息将被复制并转发到绑定到该交换的所有队列。
3.2.4 标头交换(Header exchange)

  • 标头交换将使用消息标头属性进行路由。
3.2.5 死亡信件(Dead letter)

  • 死亡信件队列收集由于各种原因(如处理错误、消息过期或传递问题)而无法成功处理的消息。

4. 协议

消息代理负责将消息从生产者传递到使用者。它们使用特定的协议来定义消息传递的规则和格式。

此域中最受欢迎的协议为以下几种:

4.1 AMQP

全称 Advanced Message Queuing Protocol(高级消息队列协议)

一种二进制协议,专为面向消息的中间件而设计,具有鲁棒性、安全性和互操作性。适用于复杂而可靠的企业消息传递系统。

  • **使用案例:**企业应用程序、财务系统和业务流程
  • **消息模型:**点对点、发布-订阅
  • **安全性:**TLS/SSL、SASL、PLAIN
  • **寻址:**使用具有路由功能的基于交换和队列的寻址
  • **架构实现:**基于代理库

4.2 MQTT

全称 Message Queuing Telemetry Transport,消息队列遥测传输

一种轻量级的发布-订阅网络协议,针对高延迟或不可靠的网络进行了优化,非常适合 IoT 方案。

  • **使用案例:**物联网设备、家庭自动化、移动消息应用程序
  • **消息传递模型:**发布-订阅
  • **安全:**TLS/SSL、SASL、普通
  • **寻址:**它使用基于主题的寻址,其中消息将发布到主题
  • **架构实现:**基于代理库

4.3 JMS

全称 Java Message Service,Java 消息服务

基于 Java 的消息传递标准为 Java 应用程序中的点对点和发布-订阅消息传递模式提供了接口。

  • **使用案例:**企业 Java 应用程序,集成多个基于 Java 的系统
  • **消息模型:**点对点、发布-订阅
  • **安全:**依赖于底层 Java EE 安全模型
  • **寻址:**使用 JNDI 查找队列和主题
  • **架构实现:**它通常在企业服务总线或应用程序服务器之上实现。

4.4 STOMP

全称 Simple Text Oriented Messaging Protocol,面向简单文本的消息传递协议

一种简单的基于文本的协议,易于实现,适用于不需要优先考虑高级消息传递功能的方案。

  • **使用案例:**快速开发环境和简单的消息传递应用程序
  • **消息模型:**点对点、发布-订阅
  • **安全:**平原;依赖于底层传输协议进行加密
  • **寻址:**基于帧,带有目标、内容类型等的标题。
  • **架构实现:**基于代理库

4.5 Kafka

全称 Kafka Protocol,Kafka协议

与 Apache Kafka 相关联,Apache Kafka 是一个能够处理高吞吐量数据流的分布式流式处理平台。

  • **使用案例:**实时分析、数据管道、流处理应用程序
  • **消息传递模型:**发布-订阅
  • **安全:**SSL/TLS、SASL
  • **寻址:**基于主题,具有可伸缩性分区功能。
  • **架构实现:**具有代理和协调的分布式系统架构。

4.6 ZMTP

全称 ZeroMQ Message Transport Protocol,ZeroMQ 消息传输协议

ZeroMQ 的底层协议是一个高性能异步消息传递库,用于构建可扩展的分布式应用程序。

  • **使用案例:**高吞吐量、低延迟应用程序、微服务架构。
  • **消息模型:**请求-回复、发布-订阅、流水线、独占对等。
  • **安全:**PLAIN、CurveZMQ 和 ZAP
  • **寻址:**使用套接字灵活寻址
  • **架构实现:**基于库,支持无代理设计或各种代理配置

5. 代理库

ActiveMQRabbitMQKafkaZeroMQ
编写语言JAVAErlangScalaC++
跨平台是的是的是的是的
开源是的是的是的是的
多种语言是的是的是的是的
支持协议AMQP、AUTO、MQTT、OpenWire、REST、RSS 和 Atom、Stomp、WSIF、WS 通知、XMPP、WebSocketAMQP、STOMP、MQTT、HTTP基于 TCP 的二进制文件TCP、UDP、inproc、PGM、IPC、TIPC、NORM、SOCKS5
服务质量至少一次 最多一次至少一次 最多一次至少一次,最多一次,恰好一次一次至少一次 最多一次
消息模式队列、Pub-Sub队列、Pub-Sub、RPC发布-订阅Request-Reply、Pub-Sub、Push-Pull、Dealer and Router、Pair、Exclusive Pair等
持性久磁盘、数据库内存、磁盘磁盘-

5.1 ActiveMQ

Apache ActiveMQ 是由 Apache 设计的开源、多协议、基于 Java 的消息代理。它以其稳健性和灵活性而闻名,支持各种消息传递协议和客户端,使其成为集成不同系统的多功能选择。

架构特点:

  • 多协议支持:ActiveMQ支持多种消息传递协议,包括AMQP、MQTT、OpenWire、STOMP、JMS等,对不同客户端需求的适应性强。
  • JMS Provider:作为 JMS Provider,ActiveMQ 遵循 JMS API,该 API 允许 Java 应用程序的松耦合、异步通信和可靠性。
  • 基于代理的架构:ActiveMQ 使用代理架构,其中中央代理处理消息路由、传递和队列。
  • 可插拔持久化和存储:提供消息持久化选项,包括数据库存储(持久化)和文件系统存储,支持高性能和高持久化场景。
  • 集群和负载均衡:支持集群和负载均衡,实现高可用性和可扩展性。
  • 客户端确认:提供不同的消息确认选项,增强消息可靠性。

使用场景:

  • 企业集成:非常适合在企业内集成不同的系统,主要是在使用基于 Java 或多个协议的情况下。
  • 异步通信:在必须解耦系统组件的情况下很有用,例如在微服务体系结构中。
  • 分布式计算(Distributed Computing):促进分布式系统中的消息通信,保证数据的一致性和可靠性。
  • 物联网通信:可用于物联网设置,尤其是在首选 MQTT 的情况下。

优点:

  • 协议支持的多功能性:ActiveMQ 的主要优势之一是它支持多种协议,在各种环境中提供灵活性。
  • 可靠性和耐久性:提供可靠的消息传递和持久的存储。
  • 集群和高可用性:支持集群以实现负载均衡和高可用性。
  • **JMS 支持:**对 JMS API 的全面支持使其成为基于 Java 的系统的有力候选者。

缺点:

  • 性能:虽然 ActiveMQ 很强大,但可能无法与一些较新的消息代理的性能匹配,尤其是在吞吐量要求极高的场景中。
  • 复杂配置:可能难以配置和管理,尤其是在集群设置中。
  • 资源使用:可能需要大量资源,尤其是在重负载下,以获得最佳性能。
  • 管理和监控: 虽然它提供了管理工具,但它们可能不如一些较新的经纪人全面和用户友好。

5.2 RabbitMQ

RabbitMQ 是一个开源的消息代理软件,被称为面向消息的中间件。它是用 Erlang 编写的,基于 Open Telecom Platform 框架构建,用于集群和故障转移。RabbitMQ 广泛用于处理异步处理,通过各种消息传递协议(主要是 AMQP(高级消息队列协议))实现分布式系统之间的通信。

架构特点:

  • 支持多种消息传递协议:虽然 RabbitMQ 主要以 AMQP 而闻名,但它也通过插件支持 MQTT、STOMP 和其他协议。
  • 生产者-消费者模型:它遵循标准的生产者-消费者模式,其中生产者发送消息,消费者接收消息,RabbitMQ 充当代理。
  • Exchange-Queue 绑定:RabbitMQ 中的消息被发布到交换,然后根据路由键和模式路由到绑定队列。
  • 持久消息传递和瞬态消息传递:支持持久消息(在磁盘上持久保存)和瞬态消息(内存中)消息。
  • 集群和高可用性:RabbitMQ 可以集群以实现高可用性和可扩展性,在多个节点之间分配队列。
  • **灵活的路由:**为不同的路由逻辑提供多种交换类型(如直接、主题、扇出和标头)。
  • 可插拔认证和授权:支持可插拔认证模块,包括 LDAP。

使用场景:

  • 异步处理:非常适合解耦 Web 应用程序中的繁重处理任务,确保响应式用户界面。
  • 服务间通信:在微服务架构中用于服务之间的通信。
  • 任务队列:非常适合处理后台任务,如发送电子邮件或处理图像。
  • 分布式系统:促进分布式系统中的消息通信,保持一致性和可靠性。

优点:

  • 可靠性:RabbitMQ 以其可靠性和确保消息传递的能力而闻名。
  • 灵活的路由能力:其路由能力比许多消息代理的路由能力更先进。
  • 可扩展性和高可用性:支持可扩展的集群,这对于大规模应用程序至关重要。
  • 广泛的协议支持:支持多种消息传递协议的能力提高了适应性。
  • 管理界面:带有用户友好的管理界面,可简化监视和管理消息流。

缺点:

  • 学习曲线:对于初学者来说,了解 RabbitMQ 的路由和设置可能很复杂。
  • 内存使用:它可能占用大量内存,尤其是在重负载下,需要适当的监控和调整。
  • Erlang 依赖性:基于 Erlang 构建,它引入了一个额外的技术堆栈,团队可能需要熟悉这些技术堆栈。
  • 高负载下的性能:虽然通常性能较高,但在极高负载或复杂的路由方案中,可能需要进行性能调整。

5.3 Kafka

Apache Kafka是由 LinkedIn 开发的开源流处理软件平台,后来捐赠给了 Apache 软件基金会。它旨在处理大量数据并实现实时数据处理。Kafka 是一种分布式、分区和复制的提交日志服务。

架构特点:

  • 生产者-消费者模型:Kafka 以生产者-消费者模型运行。生产者向 Kafka 主题发布消息,消费者订阅这些主题以阅读消息。
  • 主题和分区:Kafka 中的数据分为多个主题。每个主题都可以拆分为多个分区,从而允许并行数据处理。分区还使 Kafka 能够水平扩展。
  • 分布式系统:Kafka 在一台或多台服务器上作为集群运行,Kafka 集群将记录流存储在称为主题的类别中。
  • 复制:Kafka 跨多个节点(代理)复制数据,以确保容错性。如果一个节点发生故障,可以从其他节点检索数据。
  • Zookeeper 协调:Kafka 使用 ZooKeeper 进行集群管理和协调,保证集群间的一致性。
  • 提交日志存储:Kafka 将所有数据存储为一系列记录(或提交日志),提供持久的消息存储。

使用场景:

  • 实时数据处理:非常适合实时分析和监控系统,在这些系统中,快速数据处理至关重要。
  • 事件溯源:适用于记录应用程序中的事件序列。
  • 日志聚合:有效用于收集和处理来自多个服务的日志。
  • 流处理:可用于复杂的流处理任务,如聚合数据流或实时过滤。
  • 与大数据技术集成:通常与大数据工具一起使用,进行数据处理和分析。

优点:

  • 高吞吐量:可以处理大量数据和许多并发事务。
  • 可扩展性:易于水平和垂直扩展。
  • 持久性和可靠性:提供持久的消息存储。
  • 容错性:由于数据复制,容错性高。
  • 灵活性:可用于广泛的用例,从消息传递系统到活动跟踪和日志聚合。

缺点:

  • 复杂性:设置和管理可能很复杂,尤其是对于大型集群。
  • 资源密集型:可能是资源密集型的,需要大量的内存和 CPU。
  • **对 ZooKeeper 的依赖性:**依赖 ZooKeeper 进行协调,添加额外的组件进行管理。
  • 延迟:虽然速度很快,但可能不适合需要极低延迟的用例。

5.4 ZeroMQ

ZeroMQ(ØMQ、0MQ 或 ZMQ)是用于分布式或并发应用程序的高性能异步消息库。它不是一个消息代理,而是一个库,它将套接字通信抽象为面向消息的中间件,从而更容易以可扩展的方式实现复杂的通信模式。ZeroMQ是用C++开发的,可以通过绑定在各种编程语言中使用。

架构特点:

  • 基于套接字的通信:ZeroMQ 使用套接字来抽象出低级网络编程的复杂性。这些套接字可用于发布-订阅、请求-回复和扇出等模式。
  • 无代理设计:与传统的消息代理不同,ZeroMQ 是无代理的,允许端点之间直接通信,而无需中央消息代理。
  • **可扩展的多线程:**提供了一种通过基于套接字的通信管理多个线程的方法,从而促进了可扩展的 I/O 绑定操作。
  • 异步 I/O:支持非阻塞、异步 I/O 操作,这对于构建响应迅速的高性能应用程序至关重要。
  • **与语言无关:**为多种编程语言提供绑定,使其可以从不同的技术堆栈进行访问。

使用场景:

  • 微服务:非常适合微服务架构中的服务间通信。
  • 高性能计算:用于性能至关重要的并行处理系统。
  • 分布式系统:适合需要复杂的分布式消息传递模式的场景,而不需要代理的开销。
  • 实时通信:在需要低延迟、实时数据交换的系统中有效。

优点:

  • 高性能:ZeroMQ专为高吞吐量和低延迟而设计,适用于性能关键型应用。
  • 消息传递模式的灵活性:支持多种消息传递模式,为不同的通信场景提供灵活性。
  • 降低复杂性:无代理架构简化了部署,降低了系统复杂性。
  • 可扩展性:通过对多个连接的有效处理,方便了应用程序的扩展。
  • 轻量级:与传统消息传递代理相比,资源密集程度更低。

缺点:

  • 没有内置持久性或消息持久性:缺乏内置的消息持久性或持久性支持,必须在外部处理。
  • 需要显式管理连接:开发人员需要管理连接,重试和错误处理,这可能会增加应用程序逻辑的复杂性。
  • 学习曲线:理解和有效使用ZeroMQ的模式可能需要一个陡峭的学习曲线。
  • 缺乏中央代理:虽然这可能是一个优势,但它也意味着需要对消息传递系统进行更集中的管理、监控和控制。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

TypeScript 算法手册 【归并排序】

文章目录 1. 归并排序简介1.1 归并排序定义1.2 归并排序特点 2. 归并排序步骤过程拆解2.1 分割数组2.2 递归排序2.3 合并有序数组 3. 归并排序的优化3.1 原地归并排序3.2 混合插入排序案例代码和动态图 4. 归并排序的优点5. 归并排序的缺点总结 【 已更新完 TypeScript 设计模式…

Java | Leetcode Java题解之第452题用最少数量的箭引爆气球

题目&#xff1a; 题解&#xff1a; class Solution {public int findMinArrowShots(int[][] points) {if (points.length 0) {return 0;}Arrays.sort(points, new Comparator<int[]>() {public int compare(int[] point1, int[] point2) {if (point1[1] > point2[1…

STM32-MPU6050+DAM库源码(江协笔记)

目录 1、MPU6050简介 2、MPU6050参数 3、MPU6050硬件电路 4、MPU6050结构 5、MPU6000和MPU6050的区别 6、MPU6050应用场景 7、MPU6050电气参数 8、MPU6050时钟源选择 9、MPU6050中断源 10、MPU6050的I2C读写操作 11、DMP库移植 1、MPU6050简介 10轴传感器&#xff1…

AS-REP Roasting 实验

1. 实验网络拓扑 kali: 192.168.72.128win2008: 192.168.135.129 192.168.72.139win7: 192.168.72.149win2012:(DC) 192.168.72.131 2. 攻击原理 如果设置了不需要Kerberos预认证&#xff1a; 那么就可以直接发AS_REQ请求TGT票据&#xff0c;由于不要求预身份认证&#xff0…

Golang | Leetcode Golang题解之第453题最小操作次数使数组元素相等

题目&#xff1a; 题解&#xff1a; func minMoves(nums []int) (ans int) {min : nums[0]for _, num : range nums[1:] {if num < min {min num}}for _, num : range nums {ans num - min}return }

awd基础学习

一、常用防御手段 1、改ssh密码 passwd [user] 2、改数据库密码 进入数据库 mysql -uroot -proot 改密码 update mysql.user set passwordpassword(新密码) where userroot; 查看用户信息密码 select host,user,password from mysql.user; 改配置文件 &#xff08;否则会宕机…

信息安全工程师(30)认证概述

前言 认证&#xff0c;作为一种信用保证形式&#xff0c;是通过一系列的程序和标准来确认某人或某物的身份、资格、性能或质量的过程。其重要性不言而喻&#xff0c;是国家规范经济、促进发展的重要手段&#xff0c;也是政府保障产品、生态和人民生命财产安全的关键措施&#…

绑定Rust变量会踩什么坑

讲动人的故事&#xff0c;写懂人的代码 3.2 变量绑定的声明和初始化分开 在3.1.1中提到&#xff0c;变量的声明和初始化可以分开。而这也为程序员挖了一个坑&#xff0c;如代码清单3-4所示。 本书代码下载链接为github.com/wubin28/book_LRBACP。本书所有的代码清单&#xff…

【电路基础 · 2】电阻电路的等效变换(自用)

总览 1.电路的等效变换 1.1 电阻电路 1.2 等效变换是什么 1.3 线性电路和非线性电路 1.4 时变电路和非时变电路 1.5 二端网络&#xff08;一端口网络&#xff09;、四端网络&#xff08;二端口网络&#xff09;、六端网络&#xff08;三端口网络&#xff09; 1.6 两端电路的等…

51c自动驾驶~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/11466109 #HTCL 超过所有视觉方案&#xff01;HTCL&#xff1a;分层时间上下文问鼎OCC 本文是对ECCV2024接受的文章 HTCL: 的介绍&#xff0c;HTCL在SemanticKITTI基准测试中超过了所有基于相机的方法&#xff0c;甚至在和…

中安未来 OCR—— 开启文字识别新时代

在数字化的浪潮中&#xff0c;高效准确的文字识别技术正发挥着越来越重要的作用。今天&#xff0c;我要向大家介绍一款令人惊艳的 OCR 解决方案 —— 中安未来 OCR。 一、初识中安未来 OCR 中安未来 OCR 以其强大的功能和卓越的性能&#xff0c;在众多文字识别工具中脱颖而出。…

森林火灾检测数据集 7400张 森林火灾 带标注 voc yolo

森林火灾检测数据集 7400张 森林火灾 带标注 voc yolo 森林火灾检测数据集 名称 森林火灾检测数据集 (Forest Fire Detection Dataset) 规模 图像数量&#xff1a;共7780张图像。类别&#xff1a;仅包含一种类别——火源。 数据划分 训练集 (Train)&#xff1a;通常占总数据…

死锁的成因与解决方案

目录 死锁的概念与成因 栗子 死锁的情况 哲学家问题 如何避免死锁 必要条件 死锁的解决方案 总结 死锁的概念与成因 多个线程同时被阻塞,他们中的其中一个或者全部都在等待某个资源的释放,导致线程无限期被阻塞,程序无法停止 栗子 我和美女a出去吃饺子,吃饺子要醋和酱油…

VScode 自定义代码配色方案

vscode是一款高度自定义配置的编辑器, 我们来看看如何使用它自定义配色吧 首先自定义代码配色是什么呢? 看看我的代码界面 简而言之, 就是给你的代码的不同语义(类名, 函数名, 关键字, 变量)等设置不同的颜色, 使得代码的可读性变强. 其实很多主题已经给出了定制好的配色方案…

国庆刷题(day1)

C语言刷题&#xff1a; C刷题&#xff1a; 全对实在是太难了&#xff0c;我尽力了。。

野火STM32F103VET6指南者开发板入门笔记:【1】点亮RGB

硬件介绍 提示&#xff1a;本文是基于野火STM32F103指南者开发板所写例程&#xff0c;其他开发板请自行移植到自己的工程项目当中即可。 RGB-LEDPin引脚&#xff1a;低电平-点亮&#xff0c;高电平-熄灭REDPB5GREENPB0BLUEPB1 文章目录 硬件介绍软件介绍&#xff1a;结构体方式…

SQL Server中关于个性化需求批量删除表的做法

在实际开发中&#xff0c;我们常常会遇到需要批量删除表&#xff0c;且具有共同特征的情况&#xff0c;例如&#xff1a;找出表名中数字结尾的表之类的&#xff0c;本文我将以3中类似情况为例&#xff0c;来示范并解说此类需求如何完成&#xff1a; 第一种&#xff0c;批量删除…

leetcode_198_打家劫舍

思路&#xff1a;首先定义一个数组对于dp[i]读作1->i能获取的最大利益&#xff0c;第i个房屋只有"偷"和不"偷"两种情况&#xff0c;分别进行讨论 "偷": 既然"偷"了 i那就肯定不能偷i-1了,但是为了使"偷"的尽可能多除了必…

51单片机的串口

目录 一、串口的介绍 1、硬件电路 二、51单片机的UART 1、串口参数及时序图 2、串口模式图 3、串口和中断系统结构图 4、串口相关寄存器 三、串口向电脑发送数据 1、通过STC-ISP软件 四、电脑通过串口控制LED 1、主函数 2、 UART串口通信模块 一、串口的介绍 串口是一…