## 相关概念
整体架构模型:
![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1534487964395&di=a2a4f7d0fbc2c9c2efed702525fc6af8&imgtype=0&src=http%3A%2F%2Fimage.bubuko.com%2Finfo%2F201808%2F20180809114803031180.jpg)
### 生产者发送流程
1. 生产者连接到 RabbitMQ Broker,建立一个 Connection,开启一个 Channel(信道)
2. 生产者声明一个 Exchange 并设置相关属性
3. 生产者声明一个 Queue 并设置相关属性
4. 生产者通过路由键将 Exchange 和 Queue 绑定起来
5. 生产者发送消息至 RabbitMQ Broker,包含路由键、Exchange 等信息
6. 相应的 Exchange 根据接收的路由键查找匹配队列
7. 如果找到,则将从生产者发送过来的消息存入相应队列中
8. 如果没找到,根据生产者配置的属性选择丢弃还是回退给生产者
9. 关闭 Channel
10. 关闭连接
### 消费者接收流程
1. 消费者连接到 RabbitMQ Broker,建立一个 Connection,开启一个 Channel(信道)
2. 消费者向 RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数以及做一些准备工作
3. 等待 RbbitMQ Broker 回应并投递相应对呀中的消息,消费者接收消息
4. 消费者确认(ack)接收到的消息
5. RabbitMQ 从队列中删除相应已确认的消息
6. 关闭信道
7. 关闭连接
### 交换器
#### 类型
- fanout(扇形):将所有发送到该交换器的消息路由到所有 与该交换器绑定的队列中,无差别广播
- direct(直连):BindingKey 和 RoutingKey 完全匹配的队列
- topic(主题):RoutingKey 和 BindingKey 都用 `.` 分隔字符串(被`.`分隔开的每一段独立字符串称为一个单词),BingdingKey 中存在两种特殊字符串 `*` 和 `#`。`*`匹配一个单词,`#`用于匹配多规格单词(也可以是零个)
- headers:根据消息内容中的 `headers` 属性进行匹配。性能很差,也不实用,基本上看不见它的存在