1.rabbitmq
主要结构
1.2几个重要概念
(1) Queue
消息队列,用来存放消息。
生产者生产消息,发送最终发送到队列C1,C2中
(2) Message durability
消息持久化,我们可以将Queue与Message都设置为可持久化的
(3) Prefetch count
https://www.cnblogs.com/williamjie/p/9481774.html
比较详细,大概就是说,
- 如果一个消息队列被多个消费者订阅,
- Queue中的消息会被平摊给多个消费者
- 如果某一个消费者处理得慢,另一个消费者处理得慢,那么就会导致一个消费者正在忙,另一个消费者处在空闲
- 设置Prefetch count限制每次发送给消费者的消息数量,假如Prefetch count=1
- 那么一次队列只发给消费者一个消息
(限制队列一次发送给消费者消息的数量)
(5)Exchange
生产者发送消息到exchange(交换机),由exchang转发到指定的一个或多个queue,那么exchange如何确定要转发到哪一个queue呢?(请看binding那一节)
(6)routing key
生产者在生产消息时,会指定routing key路由规则(要发到哪些个queue),而这个routing key需要与Exchange Type及binding key联合使用才能最终生效。(下面会介绍到)
(7)Binding
RabbitMQ中通过Binding将Exchange与Queue关联起来
(7.1) Binding key
在绑定(Binding)Exchange与Queue的同时,一般会指定一个binding key。
当binding key与routing key相匹配时,消息将会被路由到对应的Queue中
Binding(BingKey,(exchange,queue))
(8)exchangeType
Exchange Type有fanout、direct、topic、headers
(8.1)fanout
anout类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。(路由到所有绑定的queue)
(8.2)direct
direct类型的Exchange路由规则也很简单,它会把消息路由到那些binding key与routing key完全匹配的Queue中。
(8.3)topic
exchang路由到rounting key 与 binding key 匹配的队列,当这里的匹配规则与direct不一样,有以下规则:
routing key 与 binding key 在命名方面:
- routing key为一个句点号“. ”分隔的字符串(我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”
- binding key与routing key一样也是句点号“. ”分隔的字符串
匹配规则方面:
- binding key中可以存在两种特殊字符 * 与 # ,用于做模糊匹配,其中 * 用于匹配一个单词,# 用于匹配多个单词(可以是零个)
假如消息routing key 为 quick.orange.rabbit,那么匹配Q1和Q2的binding key
2. springboot + rabbitmq
demo地址 https://github.com/jccccccc16/rabbitmq-study-demo
2.1 direct 交换器
配置
@Configuration
public class RabbitMQConfig {
// 定义名为queue01的队列,
@Bean
public Queue queue01(){
return new Queue("queue01",true);
}
// 定义一个directExchange
@Bean
public DirectExchange directExchange(){
return new DirectExchange("directExchange01",true,