RabbitMQ 笔记2 RabbitMQ中成员介绍

一.概述

  RabbitMQ整体上是一个生产者与消费者模型,主要负责接收,存储和转发消息,整体模型架构如下图所示:

  

 

     Producer:生产者,就是投递消息的一方。生产者创建消息然后发布到RabbitMQ中,消息一般可以分为2个部份:消息体payload和标签label。 在应用中消息体一般是一个带有业务逻辑结构的数据,比如一个json字符串。消息的标签用来表达这条消息,比如一个交换器的名称和一个路由键。生产者把消息交由RabbitMQ,RabbitMQ之后会根据标签把消息发送给感兴趣的消费者(Consumer).

    Consumer:消费者,就是接收消息的一方。消费者连接到RabbitMQ服务器,并订阅到队列上。在消息路由的过程中,消息的标签会丢弃,存入队列中的消息只有消息体,消费者也只会消费到消息体,也就不知道消息的生产者是谁。

    Broker:服务节点,对于RabbitMQ来说,一个Broker可以简单看作一个RabbitMQ服务节点或者RabbitMQ服务实例,大多数情况可以看作一台RabbitMQ服务器。

    如图所示了生产者将消息存入RabbitMQ Broker,以及消费者从Broker中消费数据的整个流程:

    

   Query队列,是 Rabbitmq的内部对象,用于存储消息。Rabbitmq的消息只能存储在队列中,这一点和kafka相反,kafka将消息存储在topic主题这个逻辑层面。多个消费者可以订阅同一个队列。如下所示:

 

     Exchange:交换器。生产者将消息发送到Exchange, 由交换器将消息路由到一个或者多个队列中,如果路由不到,或许会返回给生产者,或者直接丢弃。可以将Exchange看作一个简单的实体。另外交换器有四种类型ExchangeType后面介绍。如下所示:

    

 

   RoutingKey:路由键。生产者将消息发给交换器的时候,一般会指定一个RoutingKey,用来指定这个消息的路由规则(根据ExchangeType路由类型分发到匹配的队列中),而这个RoutingKey+ExchangeType+Bindingkey联合使用才能最终生效。在交换器和绑定键Bindingkey固定的情况下,生产者可以在发送消息给交换器时,通过指定RoutingKey来决定消息流向哪里。

  Binding:绑定。 Rabbitmq中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键,RoutingKey与Bindingkey同一个东西。如下所示:

 

 

   比例是:交换器相当于投递包裹邮箱, routingkey相当于包裹地址,Bindingkey相当于包裹目的地

 

 二.RabbitMQ运转流程

   生产者发送消息过程:

    1.生产者连接到RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel)

    2. 生产者声明一个交换器,并设置相关属性,比如交换器类型,是否持久化等

    3. 生产者声明一个队列并设置相关属性,比如是否排他,是否持久化,是否自动删除等。

    4.生产者通过路由键将交换器和队列绑定起来

    5.生产者发送消息至RabbitMQ Broker,其中包含路由键、交换器等信息

    6.相应的交换器根据接收到的路由键查找相匹配的队列。

    7.如果找到,则将生产者发送过来的消息存入到相应的队列中。

    8.如果没有找到相匹配的队列,则根据生产者配置的属性选择丢弃还是回退给生产者

    9.关闭信道

    10关闭连接

  消费者接收消息的过程

    1.消费者连接到RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel)

    2.消息者向RabbitMQ Broker请求消费相应队列中的消息,可能会设置相应的回调函授,以及做一些准备工作。

    3.等待RabbitMQ Broker回应并投递相应队列中的消息,消费者接收消息。

    4.消费者确认(ack)接收到消息

    5.RabbitMQ 从队列中删除相应已经被确认的消息

    6.关闭信道

    7.关闭连接

 

三. Connection和Channel

  上面的执行过程中,引入了两个新的概念Connection和Channel。 我们知道无论是生产者还是消费者,都需要和Rabbitmq Broker建立连接,这个连接就是一条TCPl连接,也就是Connection,一旦TCP连接建立起来,客户端紧接着可以创建一个AMQP信道(Channel),每个信道都会被指派一个唯一的ID。 信道是建立在Connection之上的虚拟连接,RabbitMQ 处理的每条AMQP指令都是通过信道完成的。

 

 

 

    为什么不直接使用Connection,还引用信道呢?试想一个应用程序有很多线程需要从Rabbitmq 中消费消息或者生产消息,那么必然需要建立很多个Connection,也就是许多个TCP连接,然而对于操作系统而言,建立和销毁是非常昂贵的开销,如果遇到使用高峰,性能瓶颈也随之显现。 Rabbitmq 采用类似NIO (非阻塞I/O)做法,信道是为了TCP连接复用,不仅可以减少性能开销,同时也便于管理。

 

四.AMQP协议介绍

  RabbitMQ是遵守AMQP协议的,还支持STOMP和MQTT等协议,AMQP的模型架构和RabbitMQ的模型构架都是一样的,生产者将消息发送给交换器,交换器和队列绑定。当生产者发送消息时所携带的Routingkey与绑定时的Bindingkey相匹配时,消息即被存入相应的队列之中。消费者可以订阅相应的队列来获取消息。

  RabbitMQ中的交换器、交换器类型、队列、绑定、路由键等都是遵循的AMQP协议中相应的概念。

  

五.交换器类型

     

posted on 2022-12-26 16:21  花阴偷移  阅读(14)  评论(0编辑  收藏  举报

导航