网站首页 > 技术文章 正文
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-07-03 pytorch v2.7.0震撼发布!Blackwell GPU支持+编译性能狂飙,AI开发
- 2025-07-03 PyWebView:用 Python 构建桌面应用的神器
- 2025-07-03 最受欢迎 Top 12 Python 开源框架,你都用过吗?
- 2025-07-03 Python Web 框架(pythonweb框架django)
- 2025-07-03 用 Python 和 Pywebview 打造现代可视化 GUI 界面
- 2025-07-03 【Python程序开发系列】使用Flask实现前后端分离(案例)
- 2025-07-03 FastUI:用Python构建高性能React应用,告别JavaScript
- 2025-07-03 UI自动化测试框架:Playwright 官方教程(三)—— 架构与通信机制
- 2025-07-03 Python 失宠!Hugging Face 用 Rust 新写了一个 ML框架,现已低调开源
- 2025-07-03 每天一个 Python 库:Django全能Web框架,一站式后台开发
你 发表评论:
欢迎- 586℃几个Oracle空值处理函数 oracle处理null值的函数
- 580℃Oracle分析函数之Lag和Lead()使用
- 568℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 564℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 561℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 553℃【数据统计分析】详解Oracle分组函数之CUBE
- 539℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 534℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)