应用场景
- 异步执行
- 应用解耦
- 消息发送
- 消息分发
RabbitMQ介绍
RabbitMQ是实现了AMQP(高级消息队列协议)的中间件的一种,服务端采用ErLang语言编写,是分布式系统中很重要的部分
相关概念
角色:发送者,交换器,队列,接收者,rabbit在普通的消息队列上多加了一层交换机的概念
原理图:
- P代表生产者
- C代表消费者
- 中间的即RabbitMQ,包含交换器和队列
几个比较重要的概念:
- 虚拟主机:一个虚拟主机持有一组交换机,队列和绑定。虚拟主机的作用:在rabbit中,用户只能在虚拟主机的细粒度下进行权限控制,如果要禁止A访问B的虚拟主机(包括队列,绑定),那就需要分别对A,B建立虚拟主机。每个rabbit服务器有一个默认的虚拟主机“/”
- 交换机:用于转发消息,不会存储消息。如果没有队列绑定到交换机的话,他会丢弃生产者发送的消息
- 路由键:当消息到达交换机时,交换机需要根据路由键来确定要发送到哪个队列
- 绑定:交换机需要和队列进行绑定,是多对多的关系
交换机
交换机只负责接受并转发消息到相关的队列,并不存储消息。在启动ACK模式下找不到队列会返回错误。
交换机的四种类型
Direc(绑定-投送)
direc是rabbit默认的交换机方式,也是最简单的方式,根据全文匹配去查找队列
direc的行为是:“先绑定,再投送”。即在绑定的时候先设定一个路由键(routing_key),只有消息的路由键匹配时才会将消息转发到绑定的队列中
模式图
图中的X-Q1有一个路由键:orange,X-Q2有两个路由键:black,green,当消息来时就会根据绑定的路由键转发到绑定的队列
tips:一个交换机--队列可以绑定多个路由键,上图表示的是Q2不仅需要black,还需要green,防止别的队列只需要green或black的情况
Topic(最灵活)
topic转发消息主要依靠通配符,交换机和路由之间的绑定会定义一种路由模式,只有在模式匹配后交换机才能转发消息
注意:
- 路由键必须是一串字符,以" . "隔开
- 路由模式必须包含一个*
topic和direct方式的异同
发送代码类似:
rabbitTemplate.convertAndSend("topicExchange","key1.key2.key3","msg")
第一个参数表示交换机,第二个参数表示路由键,第三个表示要发送的消息
topic与redic类似,只是在匹配上支持了模式,在点分形式的路由键中可以使用两个通配符:
- *:表示一个词
- #:表示0个或多个
Headers
headres也是根据模式匹配的,和topic与redic不同的是:他不采用固定的路由键,而是一个自定义匹配的类型
Fanout
广播消息的模式,不管是路由键还是路由键,都会将消息发送给绑定给他的所有队列,如果配置了路由键会陪忽略
Spring Boot继承RabbitMQ
pom包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>配置文件
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=username
spring.rabbitmq.password=password详细请看:示例代码
参考:RabbitMQ详解,非常感谢