RabbitMQ

482 阅读3分钟

应用场景

  • 异步执行
  • 应用解耦
  • 消息发送
  • 消息分发

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详解,非常感谢