网站首页 > 开源技术 正文
RabbitMQ是大家经常使用的消息中间件,本篇就来谈谈RabbitMQ架构@mikechen
RabbitMQ定义
RabbitMQ是一款使用Erlang语言开发的,实现了高级消息队列协议(AMQP)的开源消息中间件。
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议是应用层协议的一个开放标准,为面向消息的中间件设计。
Erlang语言,主要用于并发及分布式系统的开发,在电信领域应用广泛,OTP作为Erlang语言的一部分,包含了很多基于Erlang开发的中间件及工具库。
RabbitMQ的特点
1.可靠性:RabbitMQ使用一些机制来保证可靠性, 如持久化、传输确认及发布确认等。
2.灵活的路由 :在消息进入队列之前,通过交换器来路由消息。
3.扩展性:多个RabbitMQ节点可以组成一个集群,也可以根据实际业务情况动态地扩展 集群中节点。
4.高可用性:队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队 列仍然可用。
5.多种协议:RabbitMQ除了原生支持AMQP协议,还支持STOMP, MQTT等多种消息 中间件协议。
6.多语言客户端:RabbitMQ 几乎支持所有常用语言,比如 Java、 Python、 Ruby、 PHP、 C#、 JavaScript 等。
RabbitMQ架构设计
RabbitMQ架构,如下图所示:
RabbitMQ架构会涉及如下模型:Producer、Consumer、Queue、Exchange、Broker、RoutingKey、BindingKey。
RabbitMQ架构模型
1.Producer
消息生产者Producer:主要就是生成消息,通过信道(Channel),把消息发送给交换机(Exchange)。
消息一般可以包含 2 个部分:
- 消息体(payload):一般是一个带有业务逻辑结构的数据,比如:一个 JSON 字符串;
- 标签(Label):用来表述这条消息,比如:一个交换器的名称和一个路由键;
2.Consumer
这个大家也比较清楚,就是消息消费者,就是接受消息的程序。
消费者监听RabbitMQ中的(Queue)队列中的消息,然后去消费。
备注:消息(Message)会一直留在队列里,直到被消费者(Consumer)消费。
3.Queue
用于存储消息,如下图所示:
RabbitMQ 的生产者生产消息并最终投递到队列中,消费者可以从队列中获取消息并消费。
RabbitMQ中消息都只能存储在队列中,这一点和Kafka这种消息中间件相反。
多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊给多个消费者进行处理,如下图所示:
4.Exchange
生产者将消息发送到Exchange,由交换器将消息路由到一个或者多个队列中。
如下图所示:
这里的交互机会涉及如下四种类型:
- 直接Direct;
- 扇出Fanout ;
- 主题Topic ;
- 消息头Headers;
不同的类型有着不同的路由策略。
5.Broker
可以将一个RabbitMQ Broker看作一台RabbitMQ服务器,如下图所示:
上图展示了消息从生产者存入RabbitMQ Broker,以及消费者从Broker中消费数据的完整过程。
6.Routing Key
生产者将消息发给交换器的时候,一般会指定一个 RoutingKey,用来指定这个消息的路由规则。
如下图所示:
生产者可以在发送消息给交换器时,通过指定 RoutingKey 来决定消息流向哪里。
7.BindingKey
RabbitMQ 中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键(BindingKey),这样 RabbitMQ 就知道如何正确地将消息路由到队列了。
以上
更多分布式架构系列、阿里架构师进阶系列,请查看以下文章:
猜你喜欢
- 2025-03-30 Spring Boot3 竟能如此轻松整合 WebSocket 技术,你还不知道?
- 2025-03-30 2018至2023我的开源项目分享(开源项目 知乎)
- 2025-03-30 GraphQL的简单应用(graphql入门)
- 2025-03-30 前后端消息交互技术解析(前后端交互流程图)
- 2024-08-21 Python:数据的归宿(python数据的基本类型)
- 2024-08-21 微服务:从设计到部署「笔记」(微服务的部署)
- 2024-08-21 「事件驱动架构」Kafka vs. RabbitMQ:架构、性能和用例
- 2024-08-21 IoT类型、协议及无线标准(三部曲其三)
- 2024-08-21 Windows 取证之$MFT(电脑取证大师使用教程)
- 2024-08-21 大话微服务(二):微服务之间是如何通信的?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)