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 就知道如何正确地将消息路由到队列了。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》