抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Rabbit核心概念

Message:消息,是不具体的。由消息头和消息体组成。消息体是不透明的,而消息头是一系列可选属性组成,这些属性包括routing-key(路由键)、priority(优先级)、delivery-mode(是否持久存储)等

Publisher:消息的生产者,也是一个向交换机发布消息的客户端应用程序。

Exchanger:交换机,用来接收生产者发布的消息并将这些消息路由给服务器中的队列。

Binging:绑定,用于消息队列和交换器之间的管理。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则。所以可以将交换器理解成一个由绑定构成的路由表。

Queue:消息队列,用来保存消息知道发送给消费者。一个消息可投入一个或对个队列。

Connection:网络连接,比如一个TCP连接。

Channel:信道,多路复用连接中的一条独立的双向数据流通道,可读可写。一个Connection包括多个channel。因为对于操作系统来说建立和销毁TCP是非常昂贵的开销,所以引入信道的概念,以复用一条TCP连接。

Consumer:消费者,从消息队列取得消息的客户端应用程序。

VirtualHost:虚拟主机。表示一批交换机、消息队列和相关对象。vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的队列、绑定、交换器和权限控制;vhost通过在各个实例间提供逻辑上分离,允许你为不同应用程序安全保密地运行数据;vhost是AMQP概念的基础,必须在连接时进行指定,RabbitMQ包含了默认vhost:“/”。

Broker:表示消息队列服务器实体。表示启动一个rabbitmq所包含的进程。

RabbitMQ四大交换机类型

1.Direct Exchange(直连交换机)

​ 直连交换机的特点一对一,消息队列通过routingKey与交换机进行绑定,相同的routingKey会获得相同的消息。一个队列可以通过多个不同的routingKey与交换机进行绑定。不同的队列也可以通过相同的routingKey绑定交换机。

2.Fanout Exchange(扇出交换机)

扇出交换机类似于广播,只要队列与该交换机绑定,所有发送到该交换机的信息都会被转发到所有与之绑定的队列,与routingKey无关。

3.Topic Exchange(主题交换机)

一个队列可以通过多个主题与交换机绑定,多个消息队列也可以通过相同消息主题和交换机绑定。并且可以通过通配符(或者#)进行多个消息主题的适配。

消息主题的一般格式为xxx.xxx.xxx(x为英文字母,每个单词用英文句号隔开),通配符可以适配一个单词,#可以适配零个或者多个单词。

#匹配0个或多个单词,*匹配单个单词。

4.Header Exchenge(头交换机)

与routingKey无关,匹配机制是匹配消息头中的属性信息。在绑定消息队列与交换机之前声明一个map键值对,通过这个map对象实现消息队列和交换机的绑定。当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。

匹配规则x-match有下列两种类型:

x-match = all :表示所有的键值对都匹配才能接受到消息

x-match = any :表示只要有键值对匹配就能接受到消息

Topic Exchange应用范围最广!

RabbitMQ消息确认机制-可靠抵达

在MQ中,消费者和生产者并不直接进行通信,生产者只负责把消息发送到队列,消费者只负责从队列获取消息(不管是push还是pull)。

  • 消费者从队列中获取到消息之后,这条消息就不存在队列中了,但是如果此时消费者所在的信道因为网络中断没有消费到,那这条消息就被永远的丢失了,所以,我们希望等待消费者成功消费掉这个消息之后再删除这条消息。
  • 而在发送消息的时候也是这样的,生产者发消息给交换机,也不能保证消息准确发送过去了,消息就像石沉大海一样,所以这样需要一个消息确认。

publisher confirmCallback 确认模式

publisher returnCallback 未投递到queue退回模式

consumer ack机制,默认自动ack

Springboot使用RabbitMQ

导入spring-boot-starter-amqp依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

XML基本配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
rabbitmq:
host: 主机号
port: 5672(默认端口号为5672)
virtual-host: (虚拟主机)
# 开启发送端消息抵达Broker确认
publisher-confirm-type: correlated
# 开启发送端消息抵达Queue确认
publisher-returns: true
# 只要消息抵达Queue,就会异步发送优先回调returnfirm
# publisher-returns和mandatory如果都设置的话,优先级是以mandatory优先
template.mandatory: true
# 手动ack消息,不使用默认的消费端确认
listener.simple.acknowledge-mode: manual
  1. 使用RabbitMq:引入amqp场景:RabbitAutoConfiguration.class自动生效
  2. RabbitAutoConfiguration.class(RabbitMq主要配置类)中包含了RabbitTemplate、RabbitMessagingTemplate、AmqpAdmin、CachingConnectionFactory
  3. XML中配置spring.rabbitmq相关信息
  4. 使用@EnableRabbit开启
  5. 监听消息:@RabbitListener,必须有@EnableRabbit,且在业务逻辑组件容器中

​ @RabbitListener:可标在类+方法(监听哪些队列)

​ @RabbitHandler:标在方法上(重载区分不同的消息)

​ @RabbitListener和@RabbitHandler可合用用于处理多个不同的消息实体

注:Queue可以同时被多个人监听,只要收到消息,队列删除消息,而且只能由一个收到消息

​ 1、同一个消息,只能有一个客户端收到

​ 2、一个消息完全处理完,方法运行结束,才能接收到下一个消息

评论