RabbitMQ实现消息总栈

摘要:RabbitMQ是实现高级消息队列协议(AMQP)的开源消息代理软件,也成为面向消息的中间件。RabbitMQ服务器是高性能、可伸缩而闻名的Erlang语言编写而成的,其集群和故障转移是构建在开放平台框架上的。 AMQP是 Advanced Message Queuing Protocol的简称,它是面向消息中间件的开放式标准应用层协议。定义了以下特征:    1.消息方向    2.消息队列    3.消息路由(包括点到点和发....

RabbitMQ是实现高级消息队列协议(AMQP)的开源消息代理软件,也成为面向消息的中间件。RabbitMQ服务器是高性能、可伸缩而闻名的Erlang语言编写而成的,其集群和故障转移是构建在开放平台框架上的。

AMQP是AdvancedMessageQueuingProtocol的简称,它是面向消息中间件的开放式标准应用层协议。定义了以下特征:

002UASMrzy7605pjKJv15&690.jpg

1.消息方向

2.消息队列

3.消息路由(包括点到点和发布-订阅模式)

4.可靠性

5.安全性

AMQP要求消息的提供者和客户端接收者的行为要求实现对不同供应商可以用相同的方式进行互相操作。在以往的中间件标准中,主要还是建立在API级别,比如JMS,集中于通过不同的中间件实现来建立标准,而不是在多个中间件间实现互操作性。

AMQP与JMS不同,JMS定义了一个API和一组消息接收必须实现的行为,而AMQP是一个线路级协议。线路级协议描述的是通过网络发送的数据传输格式,因而,任何符合该数据格式的消息发送和接收工具都能互相兼容和进行操作,这样就能轻易实现跨技术平台的架构方案。

RabbitMQ以AMQP协议实现,所以它可以支持多种操作系统,多种编程语言,几乎可以覆盖所有主流的企业级技术平台。

RabbitMQ的基本概念:

1.Broker:可以理解为消息队列服务器的实体,它是一个中间件应用,负责接收消息生产者的消息,然后将消息发送到消息消费者或者其他Broker.

2.Exchange:消息交换机,是消息第一个到达的地方,消息通过它指定的路由规则,分布到不同的消息队列中去。

3.Queue:消息队列,消息通过发送和路由之后最终到达的地方,到达Queue的消息即进入逻辑上等待消费的状态,每个消息都会被发送到一个或者多个队列。

4.Binding:绑定,他的作用就是把Exchange和Queue按照路由规则绑定起来,也就是Exchange和Queue之间的虚拟连接。

5.RoutingKey:路由关键字,Exchange根据这个关键字进行消息投递。

6.Virtualhost:虚拟主机,它是对Broker的虚拟划分,将消费者、生产者和它们依赖的AMQP相关结构进行隔离,一般都是为了安全考虑。比如我们可以在一个Broker中设置多个虚拟主机,对不同用户进行权限的分离。

7.Connection:连接,代表生产者、消费者、Broker之间进行通信的物理连接。

8.Channel:消息通道,用于连接生产者和消费者的逻辑结构。在客户端的每个连接里可建立多个Channel,每个Channel代表一个会话任务,通过Channle可以隔离同一个连接中的不同交互内容。

9.Producer:消息生产者制造消息并发送消息的程序。

10.Consumer:消息消费者,接收消息并处理消息的程序。

消息投递到队列的整个过程大致如下:

1、客户端连接到消息队列服务器,打开一个channel.

2、客户端声明一个Exchange,并设置相关属性。

3、客户端声明一个Queue,并设置相关属性。

4、客户端使用RoutingKey,在Exchange和Queue之间建立好绑定关系。

5、客户端投递消息到Exchange

6、Exchange接收到消息后,根据消息的Key和已经设置的Binding,进行消息路由,将消息投递到一个或者多个Queue里。

Exchange也有几种类型。

1.Direct交换机:完全根据Key进行投递,比如,绑定时设置了RoutingKey为abc,那么客户端提供的消息,只有设置了Key为abc的才会被投递到队列。

2.Topic交换机:对Key进行模式匹配后进行投递,可以使用符号#匹配一个或多个词,符号*匹配正好一个词。比如,abc.#匹配abc.def.ghi,abc.*只匹配abc.def。

3.Fanout交换机:不需要任何Key,它采取了广播的模式,一个消息进来时,投递到与该交换机绑定的所有队列。

RabbitMQ支持消息的持久化,也就是将数据写在磁盘上。为了数据安全考虑,大多数情况下都会选择持久化。消息队列持久化包含三部分:

1.Exchange持久化,在声明时指定durable=>1.

2.Queue持久化,在声明时指定durable=>1.

3.消息持久化,在投递时指定deleivery_mode=>2(1是非持久化)

如果Exchange和Queue都是持久化的,它们之间的Binding也是持久化的,如果一个是非持久化的,一个是持久化的就不允许简历绑定。