【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是一致的:

  • 生产者将消息发送给交换器
  • 交换器和队列绑定
  • 生产者的消息中携带的路由键如果和绑定时的绑定键匹配时,消息就会被存入相应的队列中
  • 消费者可以订阅队列来获取消息
相关推荐
菜鸟康9 小时前
C++实现分布式网络通信框架RPC(3)--rpc调用端
分布式·网络协议·rpc
代码丰12 小时前
使用Spring Cloud Stream 模拟生产者消费者group destination的介绍(整合rabbitMQ)
java·分布式·后端·rabbitmq
.生产的驴14 小时前
SpringBoot 服务器监控 监控系统开销 获取服务器系统的信息用户信息 运行信息 保持稳定
服务器·spring boot·分布式·后端·spring·spring cloud·信息可视化
熊猫钓鱼>_>15 小时前
Python内存互斥与共享深度探索:从GIL到分布式内存的实战之旅
分布式
掘金-我是哪吒18 小时前
分布式微服务系统架构第147集:JavaPlus技术文档平台日更
分布式·微服务·云原生·架构·系统架构
白总Server18 小时前
Golang实现分布式Masscan任务调度系统
java·运维·服务器·开发语言·分布式·后端·golang
袋鼠云数栈18 小时前
从SQL Server到分布式大数据平台:重构企业数据架构
大数据·分布式·sql·重构·数据库架构
麦兜*20 小时前
【为什么RabbitMQ能够控制事务?控制事务的原理】
java·rabbitmq·java-rabbitmq
蜗牛编程之路20 小时前
RabbitMQ的使用--项目创建、五种工作模式、高级特性
数据库·分布式·rabbitmq
-代号952721 小时前
@SchedulerLock处理Spring Task在分布式环境下的重复执行问题
java·分布式·spring