交换机(Exchange)
交换机介绍
- 生产者发送消息到RabbitMQ首先会到交换机中
- 交换机的职责是根据一定规则把消息发送到队列中
- 交换机与队列的关系是多对多(多对多的关系交给Binding去维护)
- 交换机有四种类型(direct(默认)、fanout、topic,headers(基本没用请无视掉))
创建交换机
//第一个参数是:交换机名字,第二个是:交换机类型,第三个是:是否持久化,第四个是:是否自动删除(删除不再使用的交换机),第五个是:是否内部交换机(基本用不上),第六个是:扩展参数,类型为Map
channel.exchangeDeclare("shanguoyu", BuiltinExchangeType.DIRECT,false,false,false,null);
Direct类型的Exchange
当消息路由键(RouteKey)与该类型交换机的绑定一致时发送到相应队列
Topic类型的Exchange
当消息的路由键与绑定关系模糊匹配成功则发送到相应队列,使用通配符进行模糊匹配,#匹配一个或多个词,*匹配一个词
Fanout类型的Exchange
与路由键和绑定无关了,如果消息发送到Fanout类型的Exchange上,那么这种类型的交换机会把消息发送给所有队列。
队列(Queue)
队列介绍
- 用于存储消息
- 消息最终会到达队列中等待消费者取走
创建队列
//第一个参数为:队列名,第二个参数为:是否持久化,第三个参数为:是否为独占队列(用于保证顺序性),第四个参数:是否为自动删除队列(当没有消费者的时候),第五个参数为:扩展参数
channel.queueDeclare("shanguoyu",false,false,false,null);
创建队列时的扩展参数
参数名 | 目的 |
---|---|
x-dead-letter-exchange | 死信交换机 |
x-dead-letter-routing-key | 死信消息的可选路由键 |
x-expires | 队列在指定毫秒数后被删除(x-expires从没有消费者连接开始算起) |
x-ha-policy | 创建HA队列 |
x-ha-nodes | HA队列的分布节点 |
x-max-length | 队列的最大消息数 |
x-message-ttl | 毫秒为单位的消息过期时间,队列级别 |
x-max-length-bytes | 队列的最大容量,单位 Byte |
x-max-priority | 最大优先值为255的队列优先排序功能 |
绑定(Binding)
- 用于队列和交换机之间的关联(维护队列与交换机之间的关系)
- 绑定中包含路由键(RoutingKey)
- Exchanger和Queue的绑定可以绑定多次只是绑定规则不一样
消息(Message)
消息介绍
- 服务器和应用程序之间传送的数据
- 由Properties和Body(Payload)组成
Properties
属性名 | 用处 |
---|---|
content-type | 消息体的MIME类型,如application/json |
content-encoding | 消息的编码类型,如是否压缩 |
message-id | 消息的唯一性标识,由应用进行设置 |
correlation-id | 一般用做关联消息的message-id,常用于消息的响应 |
timestamp | 消息的创建时刻,整形,精确到秒 |
expiration | 消息的过期时刻,字符串,但是呈现格式为整型,精确到秒 |
delivery-mode | 消息的持久化类型,1为非持久化,2为持久化,性能影响巨大 |
app-id | 应用程序的类型和版本号 |
user-id | 标识已登录用户,极少使用 |
type | 消息类型名称,完全由应用决定如何使用该字段 |
reply-to | 构建回复消息的私有响应队列 |
headers | 键/值对表,用户自定义任意的键和值 |
priority | 指定队列中消息的优先级 |
Virtual Host
- 虚拟主机/虚拟地址
- 用于进行逻辑隔离
- 表示一批交换器、消息队列和相关对象
- Virtual Host是AMQP概念的基础,必须在连接时指定,RabbitMQ默认的vhost是 /
- 每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制