首页 > 其他分享 >百日筑基第二十天-一头扎进消息队列3-RabbitMQ

百日筑基第二十天-一头扎进消息队列3-RabbitMQ

时间:2024-07-13 23:01:41浏览次数:19  
标签:存储 队列 筑基 Broker RabbitMQ Queue 消息 数据

百日筑基第二十天-一头扎进消息队列3-RabbitMQ

在这里插入图片描述

如上图所示,RabbitMQ 由 Producer、Broker、Consumer 三个大模块组成。生产者将数据发送到 Broker,Broker 接收到数据后,将数据存储到对应的 Queue 里面,消费者从不同的 Queue 消费数据。

那么除了 Producer、Broker、Queue、Consumer、ACK 这几个消息队列的基本概念外,它还有 Exchange、Bind、Route 这几个独有的概念。

Exchange 称为交换器,它是一个逻辑上的概念,用来做分发,本身不存储数据。流程上生产 者先将消息发送到 Exchange,而不是发送到数据的实际存储单元 Queue 里面。然后 Exchange 会根据一定的规则将数据分发到实际的 Queue 里面存储。这个分发过程就是 Route(路由),设置路由规则的过程就是 Bind(绑定)。即 Exchange 会接收客户端发送 过来的 route_key,然后根据不同的路由规则,将数据发送到不同的 Queue 里面。

这里需要注意的是,在 RabbitMQ 中是没有 Topic 这个用来组织分区的逻辑概念的。 RabbitMQ 中的 Topic 是指 Topic 路由模式,是一种路由模式,和消息队列中的 Topic 意义 是完全不同的。

协议和网络模块

RabbitMQ 在协议内容和连接管理方面,都是遵循 AMQP 规范。即 RabbitMQ 的模型架构 和 AMQP 的模型架构是一样的,交换器、交换器类型、队列、绑定、路由键等都是遵循 AMQP 协议中相应的概念。

RabbitMQ 的网络层有 Connectoion 和 Channel 两个概念。

Connection 是指 TCP 连接,Channel 是 Connection 中的虚拟连接。两者的关系是:一个 客户端和一个 Broker 之间只会建立一条 TCP 连接,就是指 Connection。Channel(虚拟连 接)的概念在这个连接中定义,一个 Connection 中可以创建多个 Channel。

客户端和服务端的实际通信都是在 Channel 维度通信的。这个机制可以减少实际的 TCP 连接 数量,从而降低网络模块的损耗。从设计角度看,也是基于 IO 复用、异步 I/O 的思路来设计 的。

数据存储

RabbitMQ 的存储模块也包含元数据存储与消息数据存储两部分,两类数据都是存储在 Broker 节点上的,不会依赖第三方存储引擎。

RabbitMQ 的元数据都是存在于 Erlang 自带的分布式数据库 Mnesia 中的。即每台 Broker 都会起一个 Mnesia 进程,用来保存一份完整的元数据信息。因为 Mnesia 本身是一个分布式 的数据库,自带了多节点的 Mnesia 数据库之间的同步机制。所以在元数据的存储模块, RabbitMQ 的 Broker 只需要调用本地的 Mnesia 接口保存、变更数据即可。不同节点的元数 据同步 Mnesia 会自动完成。Mnesia 对 RabbitMQ 的作用,相当于 ZooKeeper 对于 Kafka、NameServer 对于 RocketMQ 的作用。因为 Mnesia 是内置在 Broker 中,所以部署 RabbitMQ 集群时,你会 发现只需要部署 Broker,不需要部署其他的组件。这种部署结构就很简单清晰,从而也降低 了后续的运维运营成本。

RabbitMQ 消息数据的最小存储单元是 Queue,即消息数据是按顺序写入存储 到 Queue 里面的。在底层的数据存储方面,所有的 Queue 数据是存储在同一个“文件”里 面的。这个“文件”是一个虚拟的概念,表示所有的 Queue 数据是存储在一起的意思。

RabbitMQ 也提供了过期时间(TTL)机制,用来删除集群中没用的消息。它支持单条消息和 队列两个维度来设置数据过期时间。如果在队列上设置 TTL,那么队列中的所有消息都有相同 的过期时间。我们也可以对单条消息单独设置 TTL,每条消息的 TTL 可以不同。如果两种方 案一起使用,那么消息的 TTL 就会以两个值中最小的那个为准。如果不设置 TTL,则表示此 消息不会过期。

生产者和消费者

当生产者和消费者连接到 Broker 进行生产消费的时候,是直接和 Broker 交互的,不需要客 户端寻址。客户端连接 Broker 的方式,跟我们通过 HTTP 服务访问 Server 是一样的,都是直连的。

在消费端,RabbitMQ 支持 Push(推)和 Pull(拉)两种模式,如果使用了 Push 模式, Broker 会不断地推送消息给消费者。不需要客户端主动来拉,只要服务端有消息就会将数据 推给客户端。当然推送消息的个数会受到 channel.basicQos 的限制,不能无限推送,在消费 端会设置一个缓冲区来缓冲这些消息。拉模式是指客户端不断地去服务端拉取消息, RabbitMQ 的拉模式只支持拉取单条消息。

为了保证消费流程的可靠性,RabbitMQ 也提供了消息确认机制。消费者在消费到数据的时 候,会调用 ACK 接口来确认数据是否被成功消费。

总结

RabbitMQ 主要有 Producer、Broker、Consumer、Exchange、Queue、Route、Bind、 Connection、Channel、ACK 等概念。

总结 RabbitMQ,可以从以下七个方面入手:

思考题 请你按照基础篇的课程思路,完整描述一下 RabbitMQ 从生产到消费的全过程?

  1. 协议层基于 AMQP 标准开发。
  2. 网络层核心数据流基于 TCP 协议通信,并通过 Connection 和 Channel 机制实现连接的复 用,以减少创建的 TCP 连接数量。
  3. 存储层基于多个 Queue 数据统一到一个文件存储的思路设计,同时支持分段存储和基于时 间的数据过期机制。
  4. 元数据存储是基于 Erlang 内置的数据库 Mnesia 来实现。
  5. 客户端的访问是直连的,没有客户端寻址机制。
  6. 生产端是通过 Exchange 和 Route 写入数据的,生产数据的分发是在服务端完成的,其他消息队列的分发一般都是在客户端。
  7. 消费端没有消费分组、消费分区分配等概念,直连 Queue 消费,同时也提供了手动和自动 两种 ACK 机制。

标签:存储,队列,筑基,Broker,RabbitMQ,Queue,消息,数据
From: https://blog.csdn.net/qq_45477639/article/details/140408265

相关文章

  • 最小数字游戏(Lc2974)——模拟+优先队列(小根堆)、排序+交换
    你有一个下标从 0 开始、长度为 偶数 的整数数组 nums ,同时还有一个空数组 arr 。Alice和Bob决定玩一个游戏,游戏中每一轮Alice和Bob都会各自执行一次操作。游戏规则如下:每一轮,Alice先从 nums 中移除一个 最小 元素,然后Bob执行同样的操作。接着,Bob会将......
  • 数据结构(队列的实现)
    目录队列队列的定义队列的实现创建队列的结构队列的初始化进行插入数据删除数据计算个数 判断是否为空返回队列头部数据返回队列尾部数据队列队列的定义队列是:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First......
  • 使用Spring Boot实现消息队列
    使用SpringBoot实现消息队列大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代分布式系统中,消息队列是一个非常重要的组件。它可以解耦系统的各个部分,提高系统的可伸缩性和可靠性。本文将详细介绍如何使用SpringBoot实现消息队列,包括消息的发送和接......
  • 8-队列的链式存储结构的操作
    顺序队列的操作#include<stdio.h>#include<stdlib.h>#include<stdbool.h>typedefintElemType;/*链式队列的节点*/typedefstructLinkNode{/*数据域*/ElemTypedata;/*指针域,指向下一个节点*/structLinkNode*next;}LinkNode;/*链式队列*/......
  • 「代码随想录算法训练营」第十天 | 栈与队列 part2
    150.逆波兰表达式求值题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/题目难度:中等文章讲解:https://programmercarl.com/0150.逆波兰表达式求值.html视频讲解:https://www.bilibili.com/video/BV1kd4y1o7on题目状态:多次修改bug后通过个人思路:......
  • 百日筑基第十九天-一头扎进消息队列2
    百日筑基第十九天-一头扎进消息队列2消息队列的通讯协议目前业界的通信协议可以分为公有协议和私有协议两种。公有协议指公开的受到认可的具有规范的协议,比如JMS、HTTP、STOMP等。私有协议是指根据自身的功能和需求设计的协议,一般不具备通用性,比如Kafka、RocketMQ、......
  • 7-循环队列的基本操作
    顺序队列的操作#include<stdio.h>#include<stdlib.h>#include<stdbool.h>typedefintElemType;#defineMaxSize50/*顺序队列的类型定义*/typedefstruct{/*用一维数组存放队列元素*/ElemTypedata[MaxSize];/*队头指针*/intfront;/*......
  • RabbitMQ + JMeter组合,优化你的中间件处理方式!
     RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息中间件,它是基于Erlang语言编写的,并发能力强,性能好,是目前主流的消息队列中间件之一。 RabbitMQ的安装可参照官网(https://www.rabbitmq.com/),安装完以后启动管理服务,RabbitMQ提供强大的管理功能。 在使用Jmeter处理Rabbi......
  • 数据结构(Java):队列&集合Queue&力扣面试OJ题
    1、队列1.1队列的概念队列是一个特殊的线性表,只允许在一端(队尾)进行插入数据操作,在另一端(对头)进行删除数据。队列具有先进先出FIFO(FirstInFirstOut)的特性。入队:数据只能从队尾进队列    出队:数据只能从对头出队列即:队尾进队头出我们可以把队列想象为一个排队......
  • 「代码随想录算法训练营」第九天 | 栈与队列 part1
    232.用栈实现队列题目链接:https://leetcode.cn/problems/implement-queue-using-stacks/题目难度:简单文章讲解:https://programmercarl.com/0232.用栈实现队列.html视频讲解:https://www.bilibili.com/video/BV1nY4y1w7VC题目状态:看视频讲解后通过思路:通过两个栈来实现队......