RabbitMQ:RabbiMQ的简单介绍
消息中间件即分布式系统中完成消息的发送和接收的基础软件。这些软件有很多,包括RabbitMQ,ActiveMQ(apache公司的),RocketMQ(阿里巴巴公司的,现已经转让给apache)。
消息中间件的工作过程可以用生产者消费者模型来表示。即生产者不断的向消息队列发送信息,而消费者从消息队列中消费信息。具体过程如下:
从上图可看出,对于消息队列来说,生产者,消息队列,消费者是最重要的三个概念。生产者发消息到消息队列中去,消费者监听指定的消息队列,并且当消息队列收到消息之后,接收消息队列传来的消息,并且给予相应的处理。消息队列常用于分布式系统之间互相信息的传递。
消息中间件中相关概念的介绍如下:
1 . 消息:消息是服务器与应用程序之间传送的数据,由Properties和Payload(Body)组成,Message具有如下属性 :
| 属性名 | 属性描述 |
|---|---|
| Routing key | 路由选择关键字 |
| Delivery mode | 是否持久化。Persistent表示持久化,Non-persistent表示不持久化 |
| Headers | 头信息,是由一个或多个键值对组成的,是AMQP协议留给AMQP实现做扩展使用的 |
| Properties | AMQP提供的部分属性 |
| Payload | 消息体 |
2 . 队列:队列是消息的载体,每个消息都应该被投入一个或多个队列,Queue具有如下属性 :
| 属性名 | 属性描述 |
|---|---|
| Virtual host | 虚拟主机 |
| Name | 队列名称,同一个Virtual host下不能有相同的Name |
| Durability | 是否持久化,Durable表示是,Transient表示否 |
| Auto delete | 如果该队列没有任何订阅的消费者的话,该队列会被自动删除 |
| Arguments | 参数,是AMQP协议留给AMQP实现做扩展使用的 |
对于RabbitMQ来说,除了这三个基本模块以外,还添加了一个模块,即交换机(Exchange)。它使得生产者和消息队列之间产生了隔离,生产者将消息发送给交换机,而交换机则根据调度策略(不同的路由规则)把相应的消息转发给对应的消息队列,消费者通过监听消息队列来获取消息。
RabitMQ的工作流程如下所示:
注意:交换机不存储消息,默认情况下消息如果没有被正确路由到相应队列,该消息将会被丢弃
交换机有如下属性:
| 属性名 | 属性描述 |
|---|---|
| Virtual host | 虚拟主机 |
| Name | 交换机名称,同一个Virtual host下不能有相同的Name |
| Type | 交换机类型 |
| Durability | 是否持久化,Durable表示是,Transient表示否 |
| Auto delete | 当最后一个绑定被删除后,该交换机将被删除 |
| Internal | 是否是内部专用exchange 如果是的话就意味着我们不能往该exchange里面发送消息 |
| Arguments | 参数,是AMQP协议留给AMQP实现做扩展使用的 |
RabbitMQ中的绑定通常是指交换机与队列的绑定关系(交换机与交换机绑定极少使用),Binding有如下属性 :
| 属性名 | 属性描述 |
|---|---|
| To queue | 队列名称 |
| To exchange | 交换机名称 |
| Routing key | 路由选择关键字 |
| Arguments | 路由参数, (只有Headers Exchange是根据参数路由的,故只有它需要设置该参数) |
交换机的主要作用是接收相应的消息并且绑定到指定的队列。RabbitMQ内置一个名称为空字符串的默认交换机,它根据Routing key将消息路由到与队列名与Routing key完全相等的队列中。
交换机有四种类型,分别为直连交换机Direct,主题交换机Topic,首部交换机Headers,扇形交换机Fanout。
1 . 直连交换机Direct:是RabbitMQ默认的交换机模式,也是最简单的模式。即创建消息队列的时候,指定一个BindingKey。当发送者发送消息的时候,指定对应的Routing Key。当Routing Key和消息队列的BindingKey一致的时候,消息将会被发送到该消息队列中。
2 . 主题交换机Topic:转发信息主要是依据通配符,队列和交换机的绑定主要是依据一种模式(通配符+字符串),而当发送消息的时候,只有指定的Routing Key和该模式相匹配的时候,消息才会被发送到该消息队列中。通配符*代表匹配一个单词,通配符#代表匹配0个或多个单词。
如果Binding中的Routing key不包含,#,则表示相等转发,类似于Direct Exchange 。
*如果Binding中的Routing key为#或者#.#,则表示全部转发,类似于Fanout Exchange。
3 . 首部交换机Headers[不常用 ]:也是根据一个规则进行匹配,在消息队列和交换机绑定的时候会指定一组键值对规则,而发送消息的时候也会指定一组键值对规则,当两组键值对规则相匹配的时候,消息会被发送到匹配的消息队列中。
首部交换机在进行路由转发的时候会忽略Routing Key,它将消息中的Headers与该交换机关联的所有Binding中的参数进行匹配,如果匹配上则将消息发送到Binding对应的队列中。它的匹配规则有下列两种类型:
x-match = any 表示只要有键值对匹配就能转发消息
x-match = all 表示所有的键值对都匹配才能转发消息
注意:绑定Binding的时候至少需要指定两个参数,其中一个是x-match = all/any
4 . 扇形交换机Fanout:是路由广播的形式,将会把能接受到的消息全部发送给跟自己建立绑定的队列,即便设置了Routing Key,也会被忽略。
参考:
- http://www.cnblogs.com/hlhdidi/p/6535677.html
- https://blog.csdn.net/robertohuang/article/category/6716196