RabbitMQ:RabbiMQ的简单介绍

RabbitMQ:RabbiMQ的简单介绍


      RabbitMQ是采用Erlang语言实现的AMQP协议的消息中间件(了解i消息中间件,可以查看文章:简述对消息中间件的认识),最初起源于金融系统,用于在分布式系统中存储转发消息。

      AMQP(高级消息队列协议)是一个异步消息传递所使用应用层协议规范,为面向消息中间件设计,基于此协议的客户端与消息中间件可以无视消息来源传递消息,不受客户端、消息中间件、不同的开发语言环境等条件的限制。

      支持主流操作系统:Linux、Windows,MacOX等;
      支持多种客户端开发语言:Java、Python、Ruby、.NET,PHP、C/C++、Node.js等。

      RabbitMQ中相关概念的介绍如下:

1 . Server(Broker):接收客户端连接,实现AMQP协议的消息队列和路由功能的进程。

2 . Virtual Host:虚拟主机的概念,类似权限控制组,一个Virtual Host里可以有多个Exchange和Queue,权限控制的最小粒度是Virtual Host。

3 . 消息(Message):消息是服务器与应用程序之间传送的数据,由Properties和Payload(Body)组成,Message具有如下属性 :

属性名属性描述
Routing key路由选择关键字
Delivery mode是否持久化。Persistent表示持久化,Non-persistent表示不持久化
Headers头信息,是由一个或多个键值对组成的,是AMQP协议留给AMQP实现做扩展使用的
PropertiesAMQP提供的部分属性
Payload消息体

      4 . 队列(Queue):队列是消息的载体,每个消息都应该被投入一个或多个队列,Queue具有如下属性 :

属性名属性描述
Virtual host虚拟主机
Name队列名称,同一个Virtual host下不能有相同的Name
Durability是否持久化,Durable表示是,Transient表示否
Auto delete如果该队列没有任何订阅的消费者的话,该队列会被自动删除
Arguments参数,是AMQP协议留给AMQP实现做扩展使用的

4 . 交换机(Exchange):它使得生产者和消息队列之间产生了隔离,生产者将消息发送给交换机,而交换机则根据调度策略(不同的路由规则Routing Key)把相应的消息转发给对应的消息队列,消费者通过监听消息队列来获取消息。交换机有如下属性:

属性名属性描述
Virtual host虚拟主机
Name交换机名称,同一个Virtual host下不能有相同的Name
Type交换机类型
Durability是否持久化,Durable表示是,Transient表示否
Auto delete当最后一个绑定被删除后,该交换机将被删除
Internal是否是内部专用exchange
如果是的话就意味着我们不能往该exchange里面发送消息
Arguments参数,是AMQP协议留给AMQP实现做扩展使用的

5 . 交换机类型(ExchangeType):交换机类型决定了路由消息行为,RabbitMQ中有四种类型Exchange,分别是fanout、direct、topic和headers。

6 . Binding: 绑定,通过绑定关键字(BindingKey)将一个特定的Exchange和一个特定的Queue绑定起来。RabbitMQ中的绑定通常是指交换机与队列的绑定关系(交换机与交换机绑定极少使用),Binding有如下属性 :

属性名属性描述
To queue队列名称
To exchange交换机名称
Routing key路由选择关键字
Arguments路由参数,
(只有Headers Exchange是根据参数路由的,故只有它需要设置该参数)

      RabitMQ的工作流程如下所示:
在这里插入图片描述
      注意:交换机不存储消息,默认情况下消息如果没有被正确路由到相应队列,该消息将会被丢弃

      交换机的主要作用是接收相应的消息并且绑定到指定的队列。RabbitMQ内置一个名称为空字符串的默认交换机,它根据Routing key将消息路由到与队列名与Routing key完全相等的队列中。

      交换机有四种类型,分别为直连交换机Direct,主题交换机Topic,首部交换机Headers,扇形交换机Fanout。

      1 . 直连交换机Direct:是RabbitMQ默认的交换机模式,也是最简单的模式。即创建消息队列的时候,指定一个BindingKey。当发送者发送消息的时候,指定对应的Routing Key。当Routing Key和消息队列的BindingKey一致的时候,消息将会被发送到该消息队列中。

代码实现请查看:https://blog.csdn.net/qq_29229567/article/details/86509744
在这里插入图片描述
      2 . 主题交换机Topic:转发信息主要是依据通配符,队列和交换机的绑定主要是依据一种模式(通配符+字符串),而当发送消息的时候,只有指定的Routing Key和该模式相匹配的时候,消息才会被发送到该消息队列中。通配符*代表匹配一个单词,通配符#代表匹配0个或多个单词。
      如果Binding中的Routing key不包含 *,#,则表示相等转发,类似于Direct Exchange 。
      如果Binding中的Routing key为#或者#.#,则表示全部转发,类似于Fanout Exchange。

代码实现请查看:https://blog.csdn.net/qq_29229567/article/details/86510142
在这里插入图片描述
      3 . 首部交换机Headers[不常用 ]:也是根据一个规则进行匹配,在消息队列和交换机绑定的时候会指定一组键值对规则,而发送消息的时候也会指定一组键值对规则,当两组键值对规则相匹配的时候,消息会被发送到匹配的消息队列中。
      首部交换机在进行路由转发的时候会忽略Routing Key,它将消息中的Headers与该交换机关联的所有Binding中的参数进行匹配,如果匹配上则将消息发送到Binding对应的队列中。它的匹配规则有下列两种类型:

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

      注意:绑定Binding的时候至少需要指定两个参数,其中一个是x-match = all/any。
代码实现请查看:https://blog.csdn.net/qq_29229567/article/details/86521344

      4 . 扇形交换机Fanout:是路由广播的形式,将会把能接受到的消息全部发送给跟自己建立绑定的队列,即便设置了Routing Key,也会被忽略。

代码实现请查看:https://blog.csdn.net/qq_29229567/article/details/86510358
在这里插入图片描述

参考:

  1. http://www.cnblogs.com/hlhdidi/p/6535677.html
  2. https://blog.csdn.net/robertohuang/article/category/6716196
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页