RabbitMQ研究与应用


一、 背景介绍

1. 相关概念

AMQP : Advanced Message Queuing Protocol ,  高级消息队列协议, 是应用层协议的一个开发标准,为面向消息的中间件设计。

AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全性要求很严格


二、 基本原理

1. 核心组件: Exchange & Queue

RabbitMQ的两大核心组件是Exchange和Queue

RabbitMQ研究与应用RabbitMQ研究与应用

上图中, Exchange和Queue,这两者都是在server端,又称为Broker, 这部分是RabbitMQ实现的。而蓝色的则是客户端,通常有Producer和Consumer两种类型


Exchange, 又称交换器, 接受消息和路由信息,然后将消息发送给消息队列。对于每一个虚拟主机内部,交换器有独一无二的名字。应用程序在其权限范围内可以*的创建、共享、使用和销毁交换机实例


消息队列是一个具名缓存区,它们代表一组消费者应用程序保存消息。应用程序在其权限范围之内可以*的创建、共享、使用和消费消息队列


消息队列提供了有限制的先进先出保证。服务器会将从某一个生产者发出的同等优先级的消息按照它们进入队列的顺序传递给某个消费者,万一某些消息不能被消费者处理,它们可能会被打乱顺序重新传递


消息队列将消息保存在内存、硬盘,或者这两者的组合之中。消息队列限定在虚拟主机范围之中,消息队列保存消息,并将消息分发给一个或多个订阅客户端


消息队列会跟踪消息的获取情况,消息要出队就必须被获取(acquire和consume是两个动作,先执行acquire,相对于对消息加锁)。这阻止了多个客户端同时获取和消费同一条消息,也可以被用来做单个队列多个消费者之间的负载均衡


2. 重要特性: 持久化

队列和交换机有一个创建时指定的标志durable(持久化)。durable的唯一含义就是具有这个标志的队列和交换机会在重启之后重新建立,它不表示说在队列当中的消息会在重启后恢复。


3. 核心概念:绑定

绑定就是将一个特定的Exchange和一个特定的Queue绑定起来,绑定关键字称为BindingKey

程序中语句声明方法为:

channel.queueBind("Exchange", "Queue", "BindingKey");

Exchange和Queue的绑定可以是多对多的关系。每个发送给Exchange的消息都有一个叫做Routingkey的关键字,Exchange要想将该消息转发给特定队列,该队列与交换器的BindingKey必须与消息的RoutingKey相匹配才行。


4. 通信过程

上图中,左边的客户向右边的客户发送消息

1. 在RabbitMQ中申明Connection

2. 在RabbitMQ中申明Connection

3. 左边的客户获取Connection

4. 左边的客户获取Channel

5. 定义Exchange,Queue

6, 使用一个RoutingKey将Queue Binding 到一个Exchange上

7, 通过指定一个Exchange和一个RoutingKey来讲消息发送到对应的Queue上

8. 接收方在接收时也是获取Connection,接着获取channel,然后指定一个Queue直接到它关心的Queue上取消息,它对Exchange,RoutingKey以及如何binding都不关心,到对应的Queue上取消息就可以了