RabbitMQ相关概念

一、消息中间件

        消息 (Message) 是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串、JSON等,也可以很复杂,比如内嵌对象。

        消息队列中间件 (Message Queue Middleware,简称为MQ) 是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。

        消息中间件一般有两种传递模式:点对点模式发布/订阅模式

        点对点模式是基于队列的,消息生产者发送消息到队列,消息消费者从队列中接收消息,队列的存在使得消息的异步传输成为可能
        发布订阅模式定义了如何向一个内容节点发布和订阅消息,这个内容节点称为主题(topic),主题可以认为是消息传递的中介,消息发布者将消息发布到某个主题,而消息订阅者则从主题中订阅消息。主题使得消息的订阅者与消息的发布者互相保持独立,不需要进行接触即可保证消息的传递,发布/订阅模式在消息的一对多广播时采用

1.1 消息中间件的作用

  • 解耦
  • 冗余〈存储): 有些情况下,处理数据的过程会失败。消息中间件可以把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。在把一个消息从消息中间件中删除之前,需要你的处理系统明确地指出该消息己经被处理完成,从而确保你的数据被安全地保存直到你使用完毕。
  • 削峰: 在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果以能处理这类峰值为标准而投入资源,无疑是巨大的浪费。 使用消息中间件能够使关键组件支撑突发访问压力,不会因为突发的超负荷请求而完全崩惯
  • 异步通信:在很多时候应用不想也不需要立即处理消息。 消息中间件提供了异步处理机制,允许应用把一些消息放入消息中间件中,但并不立即处理它,在之后需要的时候再慢慢处理。

二、RabbitMQ概念

        RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息

 如上图,RabbitMQ基础概念如下:

2.1 相关概念

  • Producer: 生产者,就是投递消息的一方。

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

  • Consumer: 消费者, 就是接收消息的一方。 

        消费者连接到 RabbitMQ 服务器,并订阅到队列上。 当消费者消费一条消息时, 只是消费消息的消息体 (payload) 。 在消息路由的过程中, 消息的标签会丢弃, 存入到队列中的消息只有消息体,消费者也只会消费到消息体, 也就不知道消息的生产者是谁,当然消费者也不需要知道。

  • Queue: 队列,是RabbitMQ 的内部对象,用于存储消息。 

        RabbitMQ 的生产者生产消息井最终技递到队列中,消费者可以从队列中获取消息并消费。

        多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊,即轮询给多个消费者进行处理而不是每个消费者都收到所有的消息并处理:

  • Exchange: 交换器。 

       生产者并不是将消息直接投递到队列中的,而是将消息发送到Exchange (交换器,通常也可以用大写的 "X" 来表示),交换机不存储消息,而是将消息路由到一个或者多个队列中。如果路由不到,或许会返回给生产者,或许直接丢弃。

        RoutingKey: 路由键。生产者将消息发给交换器的时候, 会指定一个RoutingKey,用来指定这个消息的路由规则。

        Binding: 绑定RabbitMQ 中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键( BindingKey) ,这样RabbitMQ 就知道如何正确地将消息路由到队列了:

       生产者将消息发送给交换器时, 需要一个RoutingKey, 当BindingKey 和RoutingKey 相匹配时, 消息会被路由到对应的队列中。

2.2 交换器类型

        RabbitMQ 常用的交换器类型有fanoutdirecttopicheaders 这四种 。

  • fanout :它会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。
  • direct:它会把消息路由到那些BindingKey 和RoutingKey完全匹配的队列中。
  • topic: direct 类型的交换器路由规则是完全匹配BindingKey 和RoutingKey,topic 类型的交换器在匹配规则上进行了扩展,比较灵活。
  • headers :类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers 属性进行匹配。

2.3 连接(Connection)和信道(Channel)

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

         这里采用了类似于NIO的TCP连接复用机制,提高了系统的性能,整体通讯过程如下图所示:

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值