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

  • 生产者将消息发送给交换器
  • 交换器和队列绑定
  • 生产者的消息中携带的路由键如果和绑定时的绑定键匹配时,消息就会被存入相应的队列中
  • 消费者可以订阅队列来获取消息
相关推荐
后端小张4 分钟前
【案例实战】初探鸿蒙开放能力:从好奇到实战的技术发现之旅
分布式·华为·云计算·harmonyos·鸿蒙·鸿蒙系统·万物互联
Xander W1 小时前
基于K8s集群的PyTorch DDP 框架分布式训练测试(开发机版)
人工智能·pytorch·分布式·python·深度学习·kubernetes
梦里不知身是客112 小时前
Spark介绍
大数据·分布式·spark
邂逅星河浪漫11 小时前
【RabbitMQ】消息队列·详解+实操演示+功能实现(微服务架构)
rabbitmq·springboot·springamqp·consumer·exchange·producer·queue
小马哥编程17 小时前
【软考架构】案例分析-分布式锁
分布式·架构
necessary65317 小时前
从工行“余额归零”事件看CAP定理:当金融系统在一致性与可用性之间做出选择
分布式·金融·wpf·可用性测试
维尔切17 小时前
Kafka 概述与安装部署整理
运维·分布式·kafka
huihuihuanhuan.xin17 小时前
后端八股之消息队列
java·rabbitmq
罗不俷18 小时前
【Hadoop】Hadoop 起源与核心组件解析 —— 大数据时代的分布式基石
大数据·hadoop·分布式
不会写代码的ys21 小时前
仿RabbitMQ实现消息队列(二)-安装
服务器·分布式·rabbitmq