【RabbitMQ 二】RabbitMQ基本组成、交换器类型、RabbitMQ生产消费消息流程、信道Channel、AMQP协议

RabbitMQ入门

1.RabbitMQ基本组成

RabbitMQ有一些基本的组成单元:

  1. Producer:消息的生产者
  2. Consumer:消息的消费者
  3. Broker:RabbitMQ的服务节点。形象一点说就是一个Broker等同于一台RabbitMQ服务器,可以接收Producer的消息,并存储消息与队列中,最终将消息发送给Consumer
  4. Queue:存储消息
    1. 注意,RabbitMQ的消息只能存储在Queue中,而Kafka将消息存储于topic的逻辑层面,Kafka的队列逻辑只是topic实际存储文件上的位移
    2. 多个消费者订阅同一个队列中的消息时,队列中的消息只能被一个消费者处理(即RabbitMQ不支持队列层面上的广播)
  5. Exchange:交换器,位于生产者和队列中间。实际上,所有Producer生产的消息,并不是直接被Producer写入队列,而是由Producer将消息交给Exchange,再由Exchange决定要将消息写入哪个队列中。这个写入消息的过程,也可以叫做"路由"
  6. Routing Key:路由键。上面说Exchange将消息写入Queue的过程就是路由,那么对于一个Exchange来说,RabbitMQ中有很多个Queue,Exchange可能需要具备区分每一个Queue的能力。
    1. 举个例子,Producer将消息发给Exchange的时候,一般要指定一个Routing Key,Exchange会使用该Routing Key和每个队列的Binding Key匹配上了,如果相同,就将消息写入对应的队列
    2. 在某些场景下,Routing Key其实和Binding Key是相同的

2.Exchange类型

  1. fanout:将所有发送到该Exchange的消息路由到所有与该Exchange绑定的Queue上
  2. direct:将所有发送到该Exchange的消息路由到RoutingKey和BindingKey完全匹配的Queue上
  3. topic:因为RoutingKey和BindingKey都是用 . 分隔的字符串(类似于java的包名),topic类型的Exchange支持使用* # 作为通配符来制定模糊匹配RoutingKey、BindingKey的规则
  4. header:不依赖RoutingKey来路由消息,而是根据发送的消息头(header属性)进行匹配

3.生产消息流程

消息生产者发送消息流程如下:

  1. Producer连接到RabbitMQ Broker,建立连接(Connection),开启信道(Channel)
  2. Producer声明一个交换器Exchange并设置相关属性
  3. Producer声明一个队列Queue并设置相关属性
  4. Producer通过路由键RoutingKey将Exchange和Queue绑定起来
  5. Producer发送消息到Broker
  6. Broker的Exchange根据路由键查找匹配的队列
    1. 如果找到,Exchange将消息存入队列中
    2. 如果没找到,丢弃或者退回消息
  7. 关闭信道、连接

4.消费消息流程

消费者消费消息的流程如下:

  1. Consumer连接到RabbitMQ Broker,建立连接(Connection),开启信道(Channel)
  2. Consumer向Broker请求消费某个队列的消息,并等待Broker发送消息
  3. Consumer接收消息,并返回确认信息ack
  4. RabbitMQ从队列中删除已经被Consumer确认的消息
  5. 关闭信道、连接

5.信道Channel

其实只要一个生产者和Broker建立了Connection就能够实现通信,一个Connection对应一条TCP连接。但是通常情况下,生产者并不需要一直向向Broker发送消息,这就会降低Connection的使用效率。

因此,RabbitMQ使用了多路复用的概念,类似于Java IO中的selector模型。来自不同生产者(也可以是相同生产者)的线程复用一个Connection,每个生产线程和Connection之间建立一个逻辑连接就是Channel。这样,能够大大降低Connection(TCP连接)的连接数量

6.AMQP协议

AMQP协议,全称是Advanced Message Queuing Protocol(高级消息队列协议)。RabbitMQ可以看做是AMQP协议的落地实现。

AMQP协议模型和RabbitMQ是一致的:

  • 生产者将消息发送给交换器
  • 交换器和队列绑定
  • 生产者的消息中携带的路由键如果和绑定时的绑定键匹配时,消息就会被存入相应的队列中
  • 消费者可以订阅队列来获取消息
相关推荐
努力的小郑1 天前
从一次分表实践谈起:我们真的需要复杂的分布式ID吗?
分布式·后端·面试
AAA修煤气灶刘哥2 天前
别让Redis「歪脖子」!一次搞定数据倾斜与请求倾斜的捉妖记
redis·分布式·后端
往事随风去2 天前
架构师必备思维:从“任务队列”到“事件广播”,彻底吃透消息队列两大设计模式
消息队列·rabbitmq
Aomnitrix2 天前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
程序消消乐2 天前
Kafka 入门指南:从 0 到 1 构建你的 Kafka 知识基础入门体系
分布式·kafka
智能化咨询2 天前
Kafka架构:构建高吞吐量分布式消息系统的艺术——进阶优化与行业实践
分布式·架构·kafka
Chasing__Dreams2 天前
kafka--基础知识点--5.2--最多一次、至少一次、精确一次
分布式·kafka
在未来等你3 天前
Elasticsearch面试精讲 Day 17:查询性能调优实践
大数据·分布式·elasticsearch·搜索引擎·面试
大数据CLUB3 天前
基于spark的澳洲光伏发电站选址预测
大数据·hadoop·分布式·数据分析·spark·数据开发