1. 介绍

RabbitMQ是流行的开源消息队列系统,用Erlang语言开发。RabbitMQ是对高级消息队列协议(Advanced Message Queueing Protocol, AMQP)的实现,AMQP是一个进程间传递异步消息的网络协议。

2. 作用

异步处理
举例:用户注册之后,需要发送短信和邮件通知,通过RabbitMQ进行性能优化。
消息中间件RabbitMQ入门简单介绍
消息中间件RabbitMQ入门简单介绍
消息中间件RabbitMQ入门简单介绍
流量削峰
举例:网上购物,当订单请求特别多时,高并发的情况,将发送的订单消息发送到RabbitMQ中,将符合请求(比如,将30分钟内没有结算的订单进行删除)的订单消息进行接收处理,以达到流量削峰的作用。

应用解耦
举例:网上购物,当订单请求发送后,减少库存的时候发生错误,导致整个购买过程崩溃,可以将订单请求发送到RabbitMQ,然后再触发减少库存的操作,如果减少库存发生错误,可以等到恢复之后再从RabbitMQ中接收消息。

日志处理

3. 相关术语

Message
消息由消息头和消息体组成。消息头包括routing-key(路由键)、priority(优先权)、delivery-mode(用于做消息持久化)等属性。
Publisher/Producer
消息的发布者(生产者),发布消息的应用程序。
Exchange
交换器,接收生产者发送的消息并且通过指定的规则将消息路由到不同的队列中。
Binding
绑定,指的是交换器和队列之间的关系,通过指定的路由规则将Exchange和Queue绑定,生成Binding Key。
Queue
消息队列,用来保存消息直到发送给消费者。
Connection
网络连接,创建一个客户端到某个虚拟主机的连接。
Channel
信道,Channel是在connection内部建立的逻辑连接。Channel是我们与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。
Consumer
消息的消费者,表示一个从消息队列中接收消息的客户端应用程序。
Vhost (Virtual Host)
虚拟主机,包含交换机,信道,队列等。一个broker可以开设多个Vhost,用于不同用户的权限分离。
Broker
RabbitMQ消息队列代理服务器实体。

4. 工作模型

消息中间件RabbitMQ入门简单介绍

5. 工作流程

生产者发送消息:
(1) 生产者连接到RabbitMQ Broker , 建立一个连接( Connection) ,开启一个信道(Channel)

(2) 生产者声明一个交换器,并设置相关属性,比如交换机类型、是否持久化等

(3) 生产者声明一个队列井设置相关属性,比如是否排他、是否持久化、是否自动删除等

(4) 生产者通过路由键将交换器和队列绑定起来

(5) 生产者发送消息至RabbitMQ Broker,其中包含路由键、交换器等信息

(6) 相应的交换器根据接收到的路由键查找相匹配的队列。

(7) 如果找到,则将从生产者发送过来的消息存入相应的队列中。

(8) 如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者

(9) 关闭信道。

(10) 关闭连接。

消费者接收消息的过程:

(1)消费者连接到RabbitMQ Broker ,建立一个连接(Connection ) ,开启一个信道(Channel) 。

(2) 消费者向RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数,以及做一些准备工作

(3)等待RabbitMQ Broker 回应并投递相应队列中的消息, 消费者接收消息。

(4) 消费者确认( ack) 接收到的消息。

(5) RabbitMQ 从队列中删除相应己经被确认的消息。

(6) 关闭信道。

(7) 关闭连接

6.常见交换机类型

Direct exchange(直连交换机)
直连型交换机(direct exchange)是根据消息携带的路由键(routing key)将消息投递给对应队列的,步骤如下:
将一个队列绑定到某个交换机上,同时赋予该绑定一个路由键(routing key)
当一个携带着路由值为R的消息被发送给直连交换机时,交换机会把它路由给绑定值同样为R的队列。

Fanout exchange(扇型交换机)
扇型交换机(funout exchange)将消息路由给绑定到它身上的所有队列。不同于直连交换机,路由键在此类型上不启任务作用。如果N个队列绑定到某个扇型交换机上,当有消息发送给此扇型交换机时,交换机会将消息的发送给这所有的N个队列

Topic exchange(主题交换机)
主题交换机(topic exchanges)中,队列通过路由键绑定到交换机上,然后,交换机根据消息里的路由值,将消息路由给一个或多个绑定队列。

扇型交换机和主题交换机异同:
对于扇型交换机路由键是没有意义的,只要有消息,它都发送到它绑定的所有队列上
对于主题交换机,路由规则由路由键决定,只有满足路由键的规则,消息才可以路由到对应的队列上

Headers exchange(头交换机)
类似主题交换机,但是头交换机使用多个消息属性来代替路由键建立路由规则。通过判断消息头的值能否与指定的绑定相匹配来确立路由规则。
此交换机有个重要参数:”x-match”
当”x-match”为“any”时,消息头的任意一个值被匹配就可以满足条件
当”x-match”设置为“all”的时候,就需要消息头的所有值都匹配成功
RabbitMQ默认定义一些交换机
在RabbitMQ默认定义一些交换机,主要如下:

默认交换机
默认交换机(default exchange)实际上是一个由RabbitMQ预先声明好的名字为空字符串的直连交换机(direct exchange)。它有一个特殊的属性使得它对于简单应用特别有用处:那就是每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routing key)名称与队列名称相同。
如:当你声明了一个名为”hello”的队列,RabbitMQ会自动将其绑定到默认交换机上,绑定(binding)的路由键名称也是为”hello”。因此,当携带着名为”hello”的路由键的消息被发送到默认交换机的时候,此消息会被默认交换机路由至名为”hello”的队列中。

交换机类型原文:https://blog.csdn.net/hry2015/article/details/79118804

新手上路,有问题务必指出,谢谢!!!

相关文章: