# 模块二 基础巩固 消息队列 介绍与基础

## 2.6.1 消息队列 -- 介绍 <a href="#id-261-xiao-xi-dui-lie-jie-shao" id="id-261-xiao-xi-dui-lie-jie-shao"></a>

* 主要使用场景
* 队列的三种形式
* 消息队列的优点

### 主要使用场景 <a href="#zhu-yao-shi-yong-chang-jing" id="zhu-yao-shi-yong-chang-jing"></a>

* 典型的异步处理
* 流量削锋
* 应用解耦

### 队列的三种形式 <a href="#dui-lie-de-san-zhong-xing-shi" id="dui-lie-de-san-zhong-xing-shi"></a>

* 点对点
* 工作队列
* 发布与订阅

### 消息队列的优点 <a href="#xiao-xi-dui-lie-de-you-dian" id="xiao-xi-dui-lie-de-you-dian"></a>

1、屏蔽异构平台的细节：发送方、接收方系统之间不需要了解双方，只需认识消息。

2、异步：消息堆积能力；发送方接收方不需同时在线，发送方接收方不需同时扩容（削峰）。

3、解耦：防止引入过多的API给系统的稳定性带来风险；调用方使用不当会给被调用方系统造成压力，被调用方处理不当会降低调用方系统的响应能力。

4、复用：一次发送多次消费。

5、可靠：一次保证消息的传递。如果发送消息时接收者不可用，消息队列会保留消息，直到成功地传递它。

6、提供路由：发送者无需与接收者建立连接，双方通过消息队列保证消息能够从发送者路由到接收者，甚至对于本来网络不易互通的两个服务，也可以提供消息路由。

## 2.6.2 RabbitMQ -- 基础 <a href="#id-262rabbitmq-ji-chu" id="id-262rabbitmq-ji-chu"></a>

* 主要场景
* AMQP

### 主要场景 <a href="#zhu-yao-chang-jing" id="zhu-yao-chang-jing"></a>

软件系统中使用消息队列的主要场景：

秒杀活动、抢购、消息通讯、邮件发送、电话短信等都是典型的采用消息中间件的业务场景。

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2Fcg8Lh6ksQgjWAKJZ1j3B%2F213.jpg?alt=media\&token=8425d1fa-0a40-485f-ab2b-08148aad0e6b)

### AMQP <a href="#amqp" id="amqp"></a>

AMQP 0-9-1 Model Explained：<https://www.rabbitmq.com/tutorials/amqp-concepts.html>

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2Fp8kQhKYRiGx9e84EII5F%2F214.jpg?alt=media\&token=39402213-cce6-4786-8bbd-f9d10bcd35c4)

* 交换机
* 队列
* 绑定
* 信道（Channel）
* 消息

#### 交换机 <a href="#jiao-huan-ji" id="jiao-huan-ji"></a>

交换机的四种类型

* Direct 直连
* Fanout 发布订阅-广播
* Topic 发布订阅-路由
* Headers

**Direct 直连**

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FdlAfGpYdbxisW833qXMO%2F215.jpg?alt=media\&token=20a45aa9-5ef0-49a4-a6f4-47839c860275)

**Fanout 发布订阅-广播**

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FsP8VP6e9UMiVrn6kklEO%2F216.jpg?alt=media\&token=45613106-fa20-4e95-b8b2-4183486415fb)

**Topic 发布订阅-路由**

Topics：<https://www.rabbitmq.com/tutorials/tutorial-five-python.html>

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FcsM4c8sqsDjk8LQxiKP3%2F217.jpg?alt=media\&token=9f443671-430f-4e6f-923d-1072d4fb3e3e)

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2Fx7kJNFYZSYa9daJBZSkc%2F218.jpg?alt=media\&token=8679c4a7-d40d-4d19-9543-d7418b5bc25f)

**Headers**

特性中可以做路由的匹配

#### 队列 <a href="#dui-lie" id="dui-lie"></a>

它们存储由应用程序使用的消息。

队列与交换共享一些属性，但也具有一些其他属性：

* 名称
* 持久（队列将在代理重新启动后幸存）
* 独占（仅由一个连接使用，并且该连接关闭时队列将被删除）
* 自动删除（至少有一个使用方的队列在最后一个使用方退订时被删除）
* 参数（可选；由插件和特定于代理的功能使用，例如消息TTL，队列长度限制等）

必须先声明队列，然后才能使用队列。声明队列将导致它创建（如果尚不存在）。如果队列已经存在并且其属性与声明中的相同，则该声明无效。

如果有至少一个消费者订阅了队列，当消息到达队列时，消息会发送给订阅者。如果一个订阅者都没有，消息会在队列中等待，直到出现第一个订阅者

#### 绑定 <a href="#bang-ding" id="bang-ding"></a>

绑定是交换使用（其中包括）将消息路由到队列的规则。

为了指示交换机E将消息路由到队列Q，必须将Q绑定到E。绑定可能具有某些交换机类型使用的可选 路由键属性。

路由密钥的目的是选择发布到交换机的某些消息以路由到绑定队列。换句话说，路由键就像一个过滤器。

#### 信道（Channel） <a href="#xin-dao-channel" id="xin-dao-channel"></a>

AMQP 引进的一个特殊的概念，建立在 tcp 之上的一个引用层协议

一个客户端与一个服务器建立一个连接，可以用于多个消费者

一个 tcp 连接里面可以产生多个信道

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2Flf4mcS4W8Kk4d5UwvuMg%2F219.jpg?alt=media\&token=9833acb4-ee69-46e9-9e25-8e9dbac3f06a)

#### 消息 <a href="#xiao-xi" id="xiao-xi"></a>

* 消息确认
* 拒绝消息
* 预读消息 prefetching
* 消息格式

**消息确认**

什么时候从队列中移除

* 默认模式（不需要 ack，发送到消费者之后即从队列中移除）
* ack 模式（需要消息者回复）

**消息格式**

* Content type
* Content encoding
* Routing key
* Delivery mode (persistent or not)
* Message priority
* Message publishing timestamp
* Expiration period
* Publisher application id
