ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

RabbitMQ--架构原理

2021-08-16 19:01:42  阅读:201  来源: 互联网

标签:架构 AMQP Exchange -- RabbitMQ Queue 队列 交换机 消息


一、AMQP架构原理

  Rabbit是使用Erlang语言开发的,其是基于AMQP协议模型开发的一款MQ(AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计)。

  AMQP的结构如下所示:

      

  AMQP协议模型由publisher application、consumer application、Server、Virtual Host、Exchange、Message Queue等组成。

    publisher application:生产者

    consumer application:消费者

    Server:也可以叫Broker,是存储消息的服务器

    Virtual Host:虚拟主机

    Exchange:交换机

    Message Queue:消息队列

  在发送消息时和消费消息时:

    应用使用Connection连接到虚拟主机

    然后通过Channel信道进行消息的读写操作,每个客户端都可以建立多个Channel, 每个channel代表一个会话任务

    读写的内容是Message消息,Message消息由Properties + body 组成,其中Properties是对消息的描述,而Body则是具体的消息内容。

    Exchange用来接收消息,然后通过Binding绑定,将Exchange中的消息与Message Queue中的队列进行绑定,最终将信息存储在Message Queue中,而Exchange和Message Queue的绑定是通过路由键Routing key来进行绑定的。

二、RabbitMQ架构

  RabbitMQ是基于AMQP协议模型开发的,因此RabbitMQ的架构图基本上与AMQP一致。

    

   RabbitMQ的处理流程与AMQP也一样:生产者发送消息到Exchange,Exchange通过路由键将消息发送到对应的MessageQueue上进行存储,而消费者则从指定的MessageQueue中读取消息。

  上图中:

    蓝色标注的是发送消息的流程,生产者发送消息到交换机,然后由交换机通过routingkey路由到指定的队列中。

    绿色标注的是消费消息的流程,消费者从指定的 队列中获取消息

    红色标注的是RabbitMQ的服务端,由Exchange交换机和队列组成

    黄色标注的是交换机和和队列的对应关系

(一)Exchange(交换机)

  1、交换机的类型

  交换机的类型有四个:direct、topic、fanout、headers(不常用)

  (1)直连交换机(direct exchange)

    直连交换机的作用其实就是一对一的作用。发送到Direct Exchange的 消息,都会被转发到Routingkey中指定的队列中。

    Direct模式可以使用RabbitMQ自带的Exchange(default Exchange),所以不需要将Exchange进行任何绑定操作,消息传递时,RoutingKey必须完全匹配才会被队列接收,否则该消息会被抛弃

  (2)主题交换机(topic exchange)

    发送到Topic Exchange上的信息,会被指定给topic相关的队列上,主要是将RoutingKey和设置的Topic进行模糊匹配。匹配方式可以使用通配符的方式,#代表匹配一个或多个词,*代表匹配一个词,例如使用 lcl# 可以匹配到 lcl.abc ,也可以匹配到 lcl.abc.123,但是如果使用 lcl*,就只能匹配到 lcl.abc ,但是匹配不到 lcl.abc.123

  (3)广播交换机(Fanout Exchange)

    直播广播,不走路由键,直接将队列绑定到交换机上,发送到交换机上的消息,全都会被转发到与该交换机绑定的队列上。

  2、交换机属性

    Durability:是否持久化

    Auto Delete:当Exchange上所有队列都删除后,Exchange也将会被自动删除。在队列上,如果找不到对应的Exchange,队列也会被清除。总之,就是队列和交换机的一方找不到对并的绑定后,其自身就会被删除。

    Internal(较少使用):这个比较少使用,设置Exchange是否只在RabbitMQ内部使用,但是我们一般都需要在代码中使用,因此一般都设置为false,除非是一些自定义的扩展插件。

    Arguments:扩展参数,用于扩展AMQP协议定制使用。

(二)Binding(绑定)

  Exchange和Queue的绑定关系,,Binding中可以包含RoutingKey或者参数

(三)Queue(队列)

  消息队列,存储消息,使用Dueability来设置是否需要持久化(Durable表示需要持久化,Transient表示不需要持久化)。Aotu Delete是否自动删除,如果选择yes,表示最后一个监听被移除后,该Queue将会被自动删除。

(四)Message(消息)

  消息由Propertites和Body组成。

    Propertites用来记录一些属性信息,例如delivery mode确定消息的送达模式(持久化或非内存级别的持久化)、headers用来自定义一些属性、content_type、content_encoding、priority、correlation_id、reply_to、expiration、message_id、timestamp、type、user_id、app_id、cluster_id等。

    Body用来存储具体的消息。

(五)Virtual Host 虚拟主机

  Virtual Host 虚拟主机是一个虚拟地址,用于进行逻辑隔离,是最上层的消息路由,一个 Virtual Host 里面可以有若干个 名称不同的Exchange 和 Queue。

 

标签:架构,AMQP,Exchange,--,RabbitMQ,Queue,队列,交换机,消息
来源: https://www.cnblogs.com/liconglong/p/15139417.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有