rabbitmq
文章目录
RabbitMQ版本
- 版本声明: 3.6.15
RabbitMQ相关概念
RabbitMQ
是一个Erlang
开发的AMQP(Advanced message Queuing Protocol,高级消息队列协议)
的开源实现,它最初起源于金融系统- 特点
AMQP
规范不仅定义了一种网络协议,同时也定义了服务端的服务与行为——AMQP模型
,AMQP模型
在逻辑上定义了三种抽象组件用于指定消息的路由行为- 模型图
Queue
Queue(队列)
是RabbitMQ
的内部对象,用于存储消息。RabbitMQ中的消息都只能存储在Queue(队列)中
。producer(生产者)
发送的消息最终会投递到Queue(队列)
中(从上图可以看出Producer并不直接与Queue直接交互),consumer(消费者)
可以从Queue(队列)
中获取消息并消费- 多个
Consumer(消费者)
可以订阅同一个Queue(队列)
,此时队列中的消息会被平均分配(Round-Robin,轮询)给多个Consumer(消费者)
处理,RabbitMQ
不支持队列层面的广播消费。
Exchange
Producer(生产者)
会将消息发送给Exchange(交换器)
,由Exchange(交换器)
将消息路由到一个或者多个Queue(队列)
(或者丢弃)。因为消息是存储在Queue(队列)
中,所以Exchange(交换器)
的使用并不真正的消耗服务器的性能,而Queue(队列)
会。
2. RoutingKey(路由键)
: Producer
将消息发送给Exchange(交换器)
时一般会指定一个RoutingKey(路由键)
用来指定这个消息的路由规则,而这个RoutingKey(路由键)
需要与交换器类型、BindingKey(绑定键)
联合使用,最终才能到相应的Queue(队列)
3. BindingKey(绑定键)
:RabbitMQ broker
通过BindingKey(绑定键)
将Exchange(交换器)
与Queue(队列)
关联起来,这样RabbitMQ Broker
就知道如何正确地将消息路由到那个Queue(队列)
了
4. 当RoutingKey(路由键)
与BindingKey(绑定键)
相匹配时,消息会被路由到对应的队列中。在绑定多个队列到同一个Exchange(交换器)
的时候,这些绑定允许使用相同的BindingKey(绑定键)
,BindingKey(绑定键)
是否有效取决于Exchange(交换器)
的类型,比如fanout
类型的Exchange(交换器)
无论BindingKey(绑定键)
是什么都会将消息路由到所有绑定到该Exchange(交换器)
的Queue(队列)
中。
5. BindingKey(绑定键)
官方解释是绑定的时候使用的RoutingKey(路由键)
,大多数时候都把BindingKey(绑定键)
和RoutingKey(路由键)
看做RoutingKey(路由键)
,事实上RabbitMQ java API
中只有RoutingKey(路由键)
,并没有BindingKey(绑定键)
,在API调用的时候需要自己辨别。
6. 发信人(Producer)
填写在包裹上的地址(RoutingKey)
和真实存在的地址(BindingKey)
相匹配时,这个包裹就会被正确的投递到目的地(Queue)
,如果匹配不上,就不会投递到目的地(Queue)
Exchange常见类型
fanout
fanout类型
的交换器会把所有发送到该Exchange
的消息路由到所有与它绑定的Queue(队列)
中。下图中,生产者(P)发送到Exchange(X)的所有消息都会路由到图中的两个Queue,并最终被两个消费者(C1与C2)消费。
direct
direct类型
的Exchange交换器
会把消息路由到那些BindingKey(绑定键)
与RoutingKey(路由键)
完全匹配的Queue(队列)
中。- 以上图的配置为例,我们以
RoutingKey="ERROR"
发送消息到Exchange
,则消息会路由到Queue1(amqp.gen-S9b…,这是由RabbitMQ自动生成的Queue名称)和Queue2(amqp.gen-Agl…);如果我们以RoutingKey="info"
或RoutingKey="warning"
来发送消息,则消息只会路由到Queue2。如果我们以其他RoutingKey
发送消息,则消息不会路由到这两个Queue
中。
topic
topic类型
的Exchange(交换器)
在匹配规则上进行了扩展,它与direct类型
的Exchange交换器
相似,也是将消息路由到BindingKey(绑定键)
与RoutingKey(路由键)
相匹配的Queue(队列)
中,但这里的匹配规则有些不同,它约定:RoutingKey(路由键)
为一个句点号"."
分隔的字符串(我们将被句点号"."
分隔开的每一段独立的字符串称为一个单词),如"stock.usd.nyse"
、"nyse.vmw"
、"quick.orange.rabbit"
。BindingKey(绑定键)
与RoutingKey(路由键)
一样也是句点号"."
分隔的字符串。BindingKey(绑定键)
中可以存在两种特殊字符"*"
与"#"
,用于做模糊匹配,其中"*"
用于匹配一个单词,"#"
用于匹配多个单词(可以是零个)。- 图示
- 以上图中的配置为例,
routingKey="quick.orange.rabbit"
的消息会同时路由到Q1与Q2,routingKey="lazy.orange.fox"
的消息会路由到Q1,routingKey="lazy.brown.fox"
的消息会路由到Q2,routingKey="lazy.pink.rabbit"
的消息会路由到Q2(只会投递给Q2一次,虽然这个RoutingKey(路由键)
与Q2的两个BindingKey(绑定键)
都匹配).routingKey="quick.brown.fox"
、routingKey="orange"
、routingKey="quick.orange.male.rabbit"
的消息将会被丢弃,因为它们没有匹配任何BindingKey(绑定键)
。
- 以上图中的配置为例,
headers
headers
类型的Exchange(交换器)
不依赖于RoutingKey(路由键)
的匹配规则来路由消息,而是根据发送的消息内容中中headers
属性进行匹配。Queue
与Exchange
绑定时指定的key-value
键值对,如果完全匹配消息发送到Exchange
时消息内容中的headers
属性(key-value
键值对),则消息会路由到该队列。headers
类型的Exchange(交换器)
性能很差,一般情况下不会使用
Virtual hosts
- 每个
virtual host
本质上都是一个RabbitMQ Server
,拥有它自己的queue
,exchagne
,和绑定规则等等。这保证了你可以在多个不同的APPlication
中使用RabbitMQ
。
docker安装
-
安装
$ docker run -d --name rabbitmq-3.6.15-management -p 15671:15671 -p 15672:15672 -p 5671:5671 -p 5672:5672 rabbitmq:3.6.15-management
-
访问http://jannal.mac.com:15672/
相关阅读
RabbitMQ入门到进阶之工作队列Work queues(Round-robi
大纲 此套免费课程视频,本人录播到了腾讯课堂 https://ke.qq.com/course/288116#tuin=5740604a 1.消息中间件概述,使用场景(日志
1、AMQP AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放
RabbitMQ集群的两种模式1)普通模式:默认的集群模式。 2)镜像模式:把需要的队列做成镜像队列。 普通模式:默认的集群模式 RabbitMQ集