RabbitMQ:RabbiMQ的简单介绍

      消息中间件即分布式系统中完成消息的发送和接收的基础软件。这些软件有很多,包括RabbitMQ,ActiveMQ(apache公司的),RocketMQ(阿里巴巴公司的,现已经转让给apache)。

      消息中间件的工作过程可以用生产者消费者模型来表示。即生产者不断的向消息队列发送信息,而消费者从消息队列中消费信息。具体过程如下:
RabbitMQ:RabbiMQ的简单介绍
      从上图可看出,对于消息队列来说,生产者消息队列消费者是最重要的三个概念。生产者发消息到消息队列中去,消费者监听指定的消息队列,并且当消息队列收到消息之后,接收消息队列传来的消息,并且给予相应的处理。消息队列常用于分布式系统之间互相信息的传递。

      消息中间件中相关概念的介绍如下:

      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的工作流程如下所示:
RabbitMQ:RabbiMQ的简单介绍
      注意:交换机不存储消息,默认情况下消息如果没有被正确路由到相应队列,该消息将会被丢弃

      交换机有如下属性:

属性名 属性描述
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一致的时候,消息将会被发送到该消息队列中。
RabbitMQ:RabbiMQ的简单介绍
      2 . 主题交换机Topic:转发信息主要是依据通配符,队列和交换机的绑定主要是依据一种模式(通配符+字符串),而当发送消息的时候,只有指定的Routing Key和该模式相匹配的时候,消息才会被发送到该消息队列中。通配符*代表匹配一个单词,通配符#代表匹配0个或多个单词。
      如果Binding中的Routing key不包含,#,则表示相等转发,类似于Direct Exchange 。
      *如果Binding中的Routing key为#或者#.#,则表示全部转发,类似于Fanout Exchange。
RabbitMQ:RabbiMQ的简单介绍
      3 . 首部交换机Headers[不常用 ]:也是根据一个规则进行匹配,在消息队列和交换机绑定的时候会指定一组键值对规则,而发送消息的时候也会指定一组键值对规则,当两组键值对规则相匹配的时候,消息会被发送到匹配的消息队列中。
      首部交换机在进行路由转发的时候会忽略Routing Key,它将消息中的Headers与该交换机关联的所有Binding中的参数进行匹配,如果匹配上则将消息发送到Binding对应的队列中。它的匹配规则有下列两种类型:

x-match = any  表示只要有键值对匹配就能转发消息
x-match = all    表示所有的键值对都匹配才能转发消息

      注意:绑定Binding的时候至少需要指定两个参数,其中一个是x-match = all/any
      
4 . 扇形交换机Fanout:是路由广播的形式,将会把能接受到的消息全部发送给跟自己建立绑定的队列,即便设置了Routing Key,也会被忽略。
RabbitMQ:RabbiMQ的简单介绍

参考:

  1. http://www.cnblogs.com/hlhdidi/p/6535677.html
  2. https://blog.csdn.net/robertohuang/article/category/6716196

相关文章: