RabbitMQ基础
一、RabbitMQ是什么
RabbitMQ是目前非常热门的消息中间件(消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成)。
为什么要使用消息中间件
消息中间件即消息队列。
以熟悉的电商场景为例,如果商品服务和订单服务是两个不同的微服务,在下单的过程中订单服务需要调用商品服务进行扣库存操作。按照传统的方式,下单过程要等到调用完毕之后才能返回下单成功,如果网络产生波动等原因使得商品服务扣库存延迟或者失败,会带来较差的用户体验,如果在高并发的场景下,这样的处理显然是不合适的,那怎么进行优化呢?这就需要消息队列登场了。
消息队列提供一个异步通信机制,消息的发送者不必一直等待到消息被成功处理才返回,而是立即返回。消息中间件负责处理网络通信,如果网络连接不可用时,将消息暂存于队列中,然后再在网络畅通时将消息转发给相应的应用程序或者服务,当然前提是这些程序或者服务订阅了该队列。如果在上面的场景中,在商品服务和订单服务之间使用消息中间件,既可以提升并发量,又降低了服务之间的耦合度
RabbitMQ简介
RabbitMQ(Rabbit Message Queue)是使用Erlang语言来编写的,并且RabbitMQ是基于AMQP协议的。Erlang语言在数据交互方面性能优秀,有着和原生Socket一样的延迟,这也是RabbitMQ高性能的原因所在。可谓“人如其名”,RabbitMQ像兔子一样迅速。
RabbitMQ特点
-
开源、性能优秀,稳定性保障
-
提供可靠性消息投递模式,返回模式
-
与Spring AMQP完美整合,API丰富
-
集群模式丰富,表达式配置,HA模式,镜像队列模型
-
保证数据不丢失的前提下做到高可靠性,可用性
RabbitMQ的应用场景
-
异步处理。把消息放入消息中间件中,等到需要的时候再去处理
-
流量削峰。比如秒杀活动,短时间内,访问量剧增,使用消息队列机制,可以在队列已满时,拒绝响应,跳转至错误页面,这样就可以使得系统不会因为超负载而崩溃
-
日志处理
-
应用解耦。假设某个服务A需要给许多个服务B、C、D发送消息,当某个服务B不需要发送消息时,服务A需要更改业务代码,当添加新的服务需要发送消息时,服务A也需要更改代码,重新部署;另外服务A需要考虑其他服务挂掉,没有收到消息时处理,需不需要再次发送。如果采用MQ消息队列的形式,发布订阅模式,服务A只需要生产服务到MQ,然后服务B、C、D在MQ中读取来自A的消息时,需要进行订阅,如果不需要了就可以取消订阅即可,跟服务A没有关系,使用这种方式可以降低服务或者系统之间的耦合
二、RabbitMQ和AMQP协议
RabbitMQ是基于AMQP协议的,AMQP (Advanced Message Queue Protocol)高级消息队列标准协议,是应用层协议,为面向消息的中间件设计
-
Server:接收客户端的连接,实现AMQP的实体服务
-
Connection:连接,应用程序与Server的网络连接,TCP连接
-
Channel:信道,消息读写等操作在信道中进行,客户端可以建立多个信道,每个信道代表一个会话任务
-
Message:消息,应用程序和服务器之间传输的数据,消息可以很简单,也可以很复杂,由Properties和Body组成,Properties为外包装,可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body就是消息体内容。
-
Virtual Host:虚拟主机,用于逻辑隔离。一个虚拟主机里面可以有若干个Exchange和Queue,同一个虚拟主机中不能有相同名称的Exchange和Queue
-
Exchange。交换器,接收消息,按照路由规则将消息路由至一个或者多个队列中。如果路由不到,或者返回生产者,或者丢弃消息。RabbitMQ中的Exchange类型主要有四种,dirct、topic、fanout、headers。
-
Binding。绑定,交换器和消息队列之间的虚拟连接,绑定中可以包含一个或者多个RoutingKey。
-
RoutingKey。路由键,生产者将消息发送给交换器的时候,会发送一个RoutingKey,用来指定路由规则,这样交换器就知道把消息发送至哪个队列。路由键通常为一个“.”分割的字符串
-
Queue。消息队列,用来保存消息,供消费者消费(那么消费者是从如何消费的呢)
我们完全可以直接使用 Connection 就能完成信道的工作,为什么还要引入信道呢?
试想这样一个场景, 一个应用程序中有很多个线程需要从 RabbitMQ 中消费消息,或者生产消息,那么必然需要建立很多个 Connection,也就是许多个 TCP 连接。然而对于操作系统而言,建立和销毁 TCP 连接是非常昂贵的开销,如果遇到使用高峰,性能瓶颈也随之显现。 RabbitMQ 采用 TCP 连接复用的方式,不仅可以减少性能开销,同时也便于管理 。
AMQP的协议模型:

具体运行机制:
生产者是投递消息的一方,首先连接到Server,建立一个连接,开启一个信道;然后生产者声明交换器和队列,设置相关属性,并通过路由键绑定交换器和队列。同理,消费者也需要进行建立连接,开启信道等操作,便于接收消息。
接着生产者就可以发送消息,发送到服务端中的虚拟主机,虚拟主机中的交换器根据路由键选择路由规则,然后发送到不同的消息队列,这样订阅了消息队列的消费者就可以获得消息,进行消费。
最后还要关闭信道和连接。
RabbitMQ是基于AMQP协议实现的,结构如下:

三、RabbitMQ的常用交换器(四种)
1、Direct Exchange
此类型交换器将所有发送到该交换器的消息被转发到RoutingKey指定的队列,也就是路由到BindingKey和RoutingKey完全匹配的队列,直接将消息发送到一个或者多个队列中。

2、Topic Exchange
此类型的交换器类似于Redis的订阅的模式功能,发送至该类型交换器中的消息被转发到所有RoutingKey中指定的Topic的队列上面。
Exchange将RoutingKey和某Topic进行模糊匹配,其中“”用来匹配一个词,“#”用于匹配一个或者多个词。例如“com.#”能匹配到“com.rabbitmq.oa”和“com.rabbitmq”;而"com."只能匹配到“com.rabbitmq”。

3、Fanout Exchange
该类型不处理路由键,会把所有发送到交换器的消息路由到所有绑定的队列中,优点是转发消息最快,性能最好

4、Headers Exchange

浙公网安备 33010602011771号