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 | <dependency> |
XML基本配置:
1 | spring: |
- 使用RabbitMq:引入amqp场景:RabbitAutoConfiguration.class自动生效
- RabbitAutoConfiguration.class(RabbitMq主要配置类)中包含了RabbitTemplate、RabbitMessagingTemplate、AmqpAdmin、CachingConnectionFactory
- XML中配置spring.rabbitmq相关信息
- 使用@EnableRabbit开启
- 监听消息:@RabbitListener,必须有@EnableRabbit,且在业务逻辑组件容器中
@RabbitListener:可标在类+方法(监听哪些队列)
@RabbitHandler:标在方法上(重载区分不同的消息)
@RabbitListener和@RabbitHandler可合用用于处理多个不同的消息实体
注:Queue可以同时被多个人监听,只要收到消息,队列删除消息,而且只能由一个收到消息
1、同一个消息,只能有一个客户端收到
2、一个消息完全处理完,方法运行结束,才能接收到下一个消息