RabbitMQ从入门到面试(二)

RabbitMQ入门

在上一篇文章中我们对消息队列有了一定的认识,在本篇博文中我们着重介绍一下RabbitMQ,通过RabbitMQ的安装,概念、使用以及所遵循的AMQP协议中的一些细节做一些研究。

RabbitMQ概念介绍

RabbitMQ是一个生产者和消费者模型,主要负责消息接收。存储和发送。
RabbitMQ的整体架构模型:
在这里插入图片描述

Producer:生产者,投递消息的一方。
Consumer:消费者,接收消息的一方。
Broker:消息中间件的服务节点。(大多数情况下可以将其看做RabbitMQ的服务器)
Queue:队列,RabbitMQ的内部对象,主要用于存储消息。
Exchange:交换器。在上图中生产者将消息发送到Exchange(一般由大写“X”表示),然后由交换器路由到一个或者多个队列中,如果路由失败可以返回给生产者或者直接丢弃。在RabbitMQ中有四种不同的交换器类型,也对应者不同的路由策略。
RoutingKey:路由键。生产者发送消息到交换器时,一般会指定一个路由键,用于指定路由规则,与交换器类型和绑定建(BindingKey)联合使用才有效。
BindingKey:绑定键。交换器和队列通过绑定建关联起来,这样就可以将消息正确的路由到队列中。
Channel:消息通道。多路复用连接中的一条独立的双向数据流通道,为数据提供传输

交换器类型

RabbitMQ中常用的有四种交换器类型:direct、topic、fanout、headers。在AMQP中还提到过System和自定义,我们暂不讨论。
direct
这个交换器的路由规则很简单,它会把消息路由到BingingKey和RoutingKey完全匹配的队列中。

topic
topic交换器的路由规则和direct类型比较类似,direct是BindingKey和RoutingKey完全匹配,但是在很多情况下是不太满足业务需求的,所以topic提供了模糊匹配的规则:
RoutingKey为一个点号“.”分割的字符串,比如“com.rabbitmq.client”、“java.util.concurrent”
BindingKey和RoutingKey一样是以点号“.”分割的字符串
BindingKey可以存在两种特殊字符串“ * ”和“#”,用于模糊匹配,其中“ * ”只能匹配一个单词,“#”可以匹配多个(可以是零个)

fanout
它可以把所有发送到交换器的消息路由到所有与该交换器绑定的队列中

headers
这种类型的交换器不依赖于路由键的匹配规则,而是消息内容中的headers属性进行匹配。headers交换器的性能比较差,在实际中用到的很少。

RabbitMQ的运行流程

生产者
(1)生产者连接RabbitMQ,建立一个连接(Connection),开启一个信道(Channel)
(2)声明一个交换器,设置交换器的属性,比如类型(direct、topic等)、是否持久化等
(3)声明一个队列并设置相关属性,是否排他、是否持久化、是否自动删除等
(4)通过路由键将交换器和队列帮顶起来
(5)将消息发送至RabbitMQ Broker
(6)交换器根据路由键查找相匹配的队列,如果找到了将消息存入相应的队列中,否则根据生产者配置的属性选择丢弃或者返回生产者
(7)关闭信道,关闭连接

消费者
(1)消费者连接RabbitMQ Broker,建立一个连接(Connection),开启通道(Channel)
(2)消费者向RabbitMQ Broker请求消费相应队列中的消息,可能会设置相应的回调函数
(3)等待Broker回应并投递消息到队列中,消费者接收消息
(4)消费者确认接收到的消息
(5)RabbitMQ从队列中删除已经确认的消息
(6)关闭信道,关闭连接

信道是建立在Connection上的虚拟连接,RabbitMQ处理的每条AMQP指令都是通过信道完成的。为什么要引入信道?
在一个程序中多个线程需要从RabbitMQ中获取消息,那么必然就需要建立多个Connection,也就是多个TCP连接,这个创建和销毁TCP的开销比较大。RabbitMQ使用了类似于NIO的做法,TCP复用。
一个线程把持一个信道,信道复用了Connection的TCP连接。而且RabbitMQ可以确保线程的私密性。

AMQP协议

RabbitMQ遵从AMQP协议。AMQP的模型架构和RabbitMQ的模型架构一样,生产者将消息发送交换器,交换器和队列绑定。
AMQP协议分为三层:
Module Layer:位于协议最高层。主要定义供客户端调用的命令,客户端利用命令实现业务逻辑。
Session Layer:中间层,主要负责将客户端命令发送服务器,再将服务器应答返回客户端,为客户端和服务器之间通信提供可靠性同步机制和错误处理。
Transport Layer:最底层,主要传输二进制流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值