2.6.1 消息队列 -- 介绍
- 主要使用场景
- 队列的三种形式
- 消息队列的优点
主要使用场景
- 典型的异步处理
- 流量削锋
- 应用解耦
队列的三种形式
- 点对点
- 工作队列
- 发布与订阅
消息队列的优点
1、屏蔽异构平台的细节:发送方、接收方系统之间不需要了解双方,只需认识消息。
2、异步:消息堆积能力;发送方接收方不需同时在线,发送方接收方不需同时扩容(削峰)。
3、解耦:防止引入过多的API给系统的稳定性带来风险;调用方使用不当会给被调用方系统造成压力,被调用方处理不当会降低调用方系统的响应能力。
4、复用:一次发送多次消费。
5、可靠:一次保证消息的传递。如果发送消息时接收者不可用,消息队列会保留消息,直到成功地传递它。
6、提供路由:发送者无需与接收者建立连接,双方通过消息队列保证消息能够从发送者路由到接收者,甚至对于本来网络不易互通的两个服务,也可以提供消息路由。
2.6.2 RabbitMQ -- 基础
- 主要场景
- AMQP
主要场景
软件系统中使用消息队列的主要场景:
秒杀活动、抢购、消息通讯、邮件发送、电话短信等都是典型的采用消息中间件的业务场景。
AMQP
AMQP 0-9-1 Model Explained:https://www.rabbitmq.com/tutorials/amqp-concepts.html
- 交换机
- 队列
- 绑定
- 信道(Channel)
- 消息
交换机
交换机的四种类型
- Direct 直连
- Fanout 发布订阅-广播
- Topic 发布订阅-路由
- Headers
Direct 直连
Fanout 发布订阅-广播
Topic 发布订阅-路由
Topics:https://www.rabbitmq.com/tutorials/tutorial-five-python.html
Headers
特性中可以做路由的匹配
队列
它们存储由应用程序使用的消息。
队列与交换共享一些属性,但也具有一些其他属性:
- 名称
- 持久(队列将在代理重新启动后幸存)
- 独占(仅由一个连接使用,并且该连接关闭时队列将被删除)
- 自动删除(至少有一个使用方的队列在最后一个使用方退订时被删除)
- 参数(可选;由插件和特定于代理的功能使用,例如消息TTL,队列长度限制等)
必须先声明队列,然后才能使用队列。声明队列将导致它创建(如果尚不存在)。如果队列已经存在并且其属性与声明中的相同,则该声明无效。
如果有至少一个消费者订阅了队列,当消息到达队列时,消息会发送给订阅者。如果一个订阅者都没有,消息会在队列中等待,直到出现第一个订阅者
绑定
绑定是交换使用(其中包括)将消息路由到队列的规则。
为了指示交换机E将消息路由到队列Q,必须将Q绑定到E。绑定可能具有某些交换机类型使用的可选 路由键属性。
路由密钥的目的是选择发布到交换机的某些消息以路由到绑定队列。换句话说,路由键就像一个过滤器。
信道(Channel)
AMQP 引进的一个特殊的概念,建立在 tcp 之上的一个引用层协议
一个客户端与一个服务器建立一个连接,可以用于多个消费者
一个 tcp 连接里面可以产生多个信道
消息
- 消息确认
- 拒绝消息
- 预读消息 prefetching
- 消息格式
消息确认
什么时候从队列中移除
- 默认模式(不需要 ack,发送到消费者之后即从队列中移除)
- ack 模式(需要消息者回复)
消息格式
- Content type
- Content encoding
- Routing key
- Delivery mode (persistent or not)
- Message priority
- Message publishing timestamp
- Expiration period
- Publisher application id