RabbitMQ_简介
什么是RabbitMQ
RabbitMQ是支持持久化消息队列的消息中间件。应用在上下游的层次级业务逻辑中,上级业务逻辑相当于生产者发布消息,下级业务逻辑相当于消费者接受到消息并且消费消息。
RabbitMQ的使用场景
- 服务解耦
- 流量削峰
- 异步调用
rabbitmq 基本概念
RabbitMQ是一种消息中间件,用于处理来自客户端的异步消息。服务端将要发送的消息放入到队列池中。接收端可以根据RabbitMQ配置的转发机制接收服务端发来的消息。RabbitMQ依据指定的转发规则进行消息的转发、缓冲和持久化操作,主要用在多服务器间或单服务器的子系统间进行通信,是分布式系统标准的配置。
Exchange
接受生产者发送的消息,并根据Binding规则将消息路由给服务器中的队列。ExchangeType决定了Exchange路由消息的行为。在RabbitMQ中,ExchangeType常用的有direct、Fanout和Topic三种。
Message Queue
消息队列。我们发送给RabbitMQ的消息最后都会到达各种queue,并且存储在其中(如果路由找不到相应的queue则数据会丢失),等待消费者来取。
Binding Key
它表示的是Exchange与Message Queue是通过binding key进行联系的,这个关系是固定。
Routing Key
生产者在将消息发送给Exchange的时候,一般会指定一个routing key,来指定这个消息的路由规则。这个routing key需要与Exchange Type及binding key联合使用才能生,我们的生产者只需要通过指定routing key来决定消息流向哪里。
rabbitmq六种工作模式
简单模式
- 发送消息的程序是生产者
- 队列就代表一个邮箱。虽然消息会流经RbbitMQ和你的应用程序,但消息只能被存储在队列里。队列存储空间只受服务器内存和磁盘限制,它本质上是一个大的消息缓冲区。多个生产者可以向同一个队列发送消息,多个消费者也可以从同一个队列接收消息.
- 消费者等待从队列接收消息
工作模式
工作队列(即任务队列)背后的主要思想是避免立即执行资源密集型任务,并且必须等待它完成。相反,我们将任务安排在稍后完成。
我们将任务封装为消息并将其发送到队列。后台运行的工作进程将获取任务并最终执行任务。当运行多个消费者时,任务将在它们之间分发。
发布订阅模式
RabbitMQ消息传递模型中的核心思想是生产者从不将任何消息直接发送到队列。实际上,生产者经常甚至根本不知道是否将消息传递到任何队列。
相反,生产者只能将消息发送到交换机。交流是一件非常简单的事情。一方面,它接收来自生产者的消息,另一方面,将它们推入队列。交易所必须确切知道如何处理收到的消息。是否应将其附加到特定队列?是否应该将其附加到许多队列中?还是应该丢弃它。规则由交换类型定义 。
路由模式
使用的是扇出交换,它并没有给我们太大的灵活性-它只能进行无意识的广播。
我们将使用直接交换。直接交换背后的路由算法很简单-一条消息进入其绑定密钥与该消息的路由密钥完全匹配的队列 。
为了说明这一点,请考虑以下设置:
在此设置中,我们可以看到绑定了两个队列的直接交换X。第一个队列由绑定键orange绑定,第二个队列有两个绑定,一个绑定键为black,另一个绑定为green。
在这样的设置中,使用路由键橙色发布到交换机的消息 将被路由到队列Q1。路由键为黑色或绿色的消息将转到Q2。所有其他消息将被丢弃
主题模式
发送到主题交换的消息不能具有任意的 routing_key-它必须是单词列表,以点分隔。这些词可以是任何东西,但通常它们指定与消息相关的某些功能。一些有效的路由关键示例:“ stock.usd.nyse ”,“ nyse.vmw ”,“ quick.orange.rabbit ”。路由密钥中可以包含任意多个单词,最多255个字节。
绑定密钥还必须采用相同的形式。主题交换背后的逻辑类似于直接交换的逻辑 -使用特定路由密钥发送的消息将传递到所有使用匹配绑定密钥绑定的队列。但是,绑定键有两个重要的特殊情况:
*(星号)可以代替一个单词。
#(哈希)可以替代零个或多个单词。
RPC模式
我们的RPC将像这样工作:
- 客户端启动时,它将创建一个匿名排他回调队列。
对于RPC请求,客户端发送一条消息,该消息具有两个属性: reply_to(设置为回调队列)和correlation_id(设置为每个请求的唯一值)。 - 该请求被发送到rpc_queue队列。
- RPC工作程序(又名:服务器)正在等待该队列上的请求。出现请求时,它将使用reply_to字段中的队列来完成工作,并将消息和结果发送回客户端。
- 客户端等待回调队列上的数据。出现消息时,它将检查correlation_id属性。如果它与请求中的值匹配,则将响应返回给应用程序。
rabbitmq相关组成
producer:消息生产者,生产消息并投递到队列之中。
cusumer:消息消费者,从队列中获取消息并消费。
queue:消息队列,用于存放消息。在rabbmitmq中通过绑定键(binding key)接收对应exchange(交换机)的消息。
virtual host(vhost):虚拟主机,用户在虚拟主机层面进行一些权限设置。比如我可以访问哪些队列,可以处理哪些请求。
borker:消息转发者。
exchange:交换机,直接和producer交互,主要进行消息的转发
binding key:绑定键,将exchange和queue按照路由键绑定。
routing key:路由键,exchange根据路由键进行消息投递。
channel:消息通道,在客户端每个连接里,可以建立多个channel,每个channel代表一个会话任务