• RabbitMQ--架构原理


    一、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。

    ------------------------------------------------------------------
    -----------------------------------------------------------
    ---------------------------------------------
    朦胧的夜 留笔~~
  • 相关阅读:
    springboot项目打包方式
    Spring Boot 打包方式的选择
    java 正则匹配输出匹配内容
    Nacos注册中心的部署与用法详细介绍
    分库分表ShardingSphere,一文带你搞透(建议收藏)
    SpringCloud Ribbon负载均衡 + OpenFeign远程HTTP调用用法与原理
    vue和微信小程序的区别
    归并排序.md
    域渗透之银票据学习.md
    1_windows历程.md
  • 原文地址:https://www.cnblogs.com/liconglong/p/15139417.html
Copyright © 2020-2023  润新知