# RabbitMQ相关概念
特点
- 可靠性:持久、传输确认、发布确认
- 路由灵活:交换器
- 内置交换器
- 支持绑定多个交换器形成复杂路由
- 插件机制
- 扩展性:集群,动态扩展集群节点
- 高可用:设置镜像
- 多协议,多客户端,管理界面
- 插件机制
相关概念
- 生产者:消息包含2部(消息体,标签)
- 消费者:路由过程中标签会被丢弃,存入队列中的消息只有消息体
- Broker:消息中间件服务节点
- 队列:内部对象,用于存储消息,消息存储在队列中。多个消费者可订阅同一个队列。不支持队列层面的广播消息
- 交换器:Exchange,消息先到交换器,由交换器把消息路由到一个或多个队列,如果路由不到则丢弃或返回生产者
- 路由键:RoutingKey,需要与交换器类型和绑定键联合使用
- 绑定:Binding,通过绑定把交换器与队列关联,BindingKey 绑定键
示例
// 连接到Broker,建立一个Connection,开启一个信道Channel
...
// direct 类型的交换器中他们是同一个东西
ROUTING_KEY=BINDING_KEY;
// 声明一个交换器,并设置相关属性(创建一个 type=direct 持久化、非自动删除的交换器)
channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, null);
// 声明一个队列,并设置相关属性(创建一个:持久化、非排他的、非自动删除的队列)
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
// 通过路由键将交换器与队列绑定起来
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, BINDING_KEY);
// 发送消息到Broker,其中包含:路由键,交换器等信息
String message = "Hello World!";
channel.basicPublish(EXCHANGE_NAME,
ROUTING_KEY,
MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes());
// 相应交换器根据接收到的路由键查找匹配的队列
// 找到:存储相应的队列中
// 没找到:根据生产者配置的属性,丢弃或者回退给生产者
// 关闭信道和键接
// 消费者
// 键接到Broker,创建一个键接Connection,开启一个信道Channel
// 向Broker请求消费相应队列中的消息,设置回调函数,及做准备工作
// 待等Broker回应及投递队列中的消息,消费者消费消息
// 消费者确认(ack)接收消息
// RabbitMQ从队列中删除被确认的消息
// 关闭信息及链接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
- 绑定时使用BindingKey:
channel.exchangeBind
,channel.queueBind
- 发送消息使用RoutingKey:
channel.basicPublish
交换器类型
- Fanout:广播,广播到绑定的交换器队列
- Direct:路由到RoutingKey与BindingKey完全相同的队列
- Topic:路由到RoutingKey与BindingKey相匹配的队列中,但匹配规则不同
- RoutingKey为带
.
分隔的字符串,如:com.tianjiaguo.site
- BindingKey同样是一个带
.
的字符串 - BindingKey可以模糊匹配
#
匹配一个单词*
匹配多规格单词,可以是0个
- RoutingKey为带
- Headers:不依赖于路由键匹配规则来路由信息,根据发送内容的Header属性来进行匹配
- System
- 自定义
AQMP协议