RabbitMQ 模拟实现【一】:需求分析

文章目录

  • 消息队列
    • 消息队列
    • 消息队列的作用
    • 图解生产者消费者模型
    • BrokerSever 内部涉及的关键概念
    • 交换机功能
    • 消费的实现方式
    • 数据存储方式
    • 网络通信
    • 消息应答模式

消息队列模拟实现Gitee网址

消息队列

采用 SpringBoot 框架实现

消息队列

通常说的消息队列,简称MQ(Message Queue),指的就是消息中间件。简单理解为一个使用阻塞队列来通信的组件,本质上就是个转发器,包含发消息,存消息,消费消息的过程。他是一种⽣产者消费模型 (进程和进程之间/服务和服务之间)

消息队列的作用

  • 解耦合
    • 本来有个分布式系统,A服务器 调⽤ B服务器(A给B发请求,B给A返回响应)===》 A 和 B 的耦合是⽐较⼤的!
    • 引⼊消息队列后,A把请求发送到消息队列,B再从消息队列获取到请求,将 A 与 B 之间的耦合程度降低(追求高内聚、低耦合)
  • 削峰填⾕
    • ⽐如A是⼊⼝服务器,A 调⽤ B 完成⼀些具体业务,如果是 A 和 B 直接通信,如果突然A 收到⼀组⽤户的请求的峰值,此时 B 也会随着受到峰值~
    • 引⼊消息队列后,A把请求发送到消息队列,B再从消息队列获取到请求。 (虽然A收到很多请
      求,队列也收到了很多请求,但是B仍旧可以按照原来的节奏处理请求。不⾄于说⼀下就收到太
      多的并发量而导致服务器 B 奔溃)

图解生产者消费者模型

在这里插入图片描述
结合实际,我们多使用消息队列在分布式系统中,一对一或者一对多的关系无法满足我们服务器对于消息队列的需求,因此以多对多的方式来实现

BrokerSever 内部涉及的关键概念

  • 虚拟主机(Virtual Host):可以看做一个“逻辑”上的数据集合
  • 交换机(Exchange):生产者把消息投递到 BrokerSever 实际上是先把消息交给 BrokerSever 上的某个交换机,再有交换机把消息转发给对应的队列(类似“前台”)
  • 队列(Queue):真正用来存储处理消息的实体后续消费者也是从对应的队列中去数据,大队 列中也可以有很多小的队列
  • 绑定(Bingding):把交换机和队列建立起关联关系(交换机和队列视为“多对多”关系)
  • 消息(Message):具体来说,可以认为是服务器 A 给 B 发的请求(通过MQ转发)就是一个消息,服务器 B 给 A 返回的响应,,也可看做是一个消息,消息可以视为一个字符串(二进制数据)

交换机功能

交换机类型:用于描述不同的转发规则

1 Direct 直接交换机:

  • 生产者发送消息的时候会指定一个“目标队列”的名字
  • 交换机收到以后就看看绑定的队列里有没有匹配的队列~
  • 如果有,转发过去(把消息塞进对应的队列中)如果没有则直接丢弃

2 Fanout 扇出交换机:

  • 把消息放到交换机绑定的每个队列
  • 只要和这个交换机绑定任何队列都会转发消息

3 Topic 主题交换机:

  • bindingKey.把队列和交换机绑定的时候,指定一个单词,暗号~
  • routingKey.生产者发送消息时,也指定一个单词
  • 如果 bindingKey 和 routingKey 对上暗号~~此时就可以把这个消息转发到对应的队列中

消费的实现方式

此处采用 推 的实现方式:Broker把收到的数据主动发送给订阅的消费者(订阅:哪些消费者要从中间人这里取数据,这个注册的过程,称为“订阅”)

数据存储方式

数据的存储主要有两点需要注意:持久化 + 高效,因此采用 内存 + 硬盘 的方式来存储

  • 内存:高效的转发处理数据,效率高
  • 硬盘:防止在内存中的数据随着进程重启/主机重启而丢失

网络通信

此处的目的是让客户端通过网络调用 BrokerSever 提供的编程接口,采用 TCP + 自定义的应用层协议 来实现生产者/消费者模型,如下图解所示:
在这里插入图片描述

消息应答模式

根据需求不同,此处有两种方式实现消息应答:

  1. ⾃动应答,消费者把这个消息取⾛了,就算应答了
  2. ⼿动应答,basicAck ⽅法属于⼿动应答(消费者需要主动调⽤这个 API 来进⾏应答)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/537668.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

json展示curl 请求接口返回结果

使用curl发送请求并将返回结果以JSON格式展示,通常需要确保请求的响应本身就是JSON格式。可以结合jq这个JSON处理工具来格式化输出。 首先要安装jq 工具。 Linux发行版中,你可以使用包管理器来安装它。 sudo yum install jq # 对于CentOS/RHEL 安装成…

多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测

多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测 目录 多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现VMD-CN…

Unity Timeline学习笔记(3) - SignalTrack信号轨道和自定义带参数的Marker信号和轨道

信号轨道,顾名思义就是运行到某处发送一个信号。 普通用法 普通用法就是没有任何封装的,个人感觉特别难用,但是有必要理解一下工作原理。 添加信号 我们添加一个信号资源 生成后可以看到资源文件,这个是可以拖到SignalTrack上…

【Unity】persistentDataPath、streamingAssetsPath和dataPath

介绍 我们在用Unity进行开发时,资源路径是我们最常用到的,下面我就来简单介绍一下几种常用的路径。 1.dataPath dataPath是包含游戏数据文件夹的路径,是app程序包安装路径 Windows: xxx /Assets (如下图) Mac: xxx…

opencv dnn模块 示例(25) 目标检测 object_detection 之 yolov9

文章目录 1、YOLOv9 介绍2、测试2.1、官方Python测试2.1.1、正确的脚本2.2、Opencv dnn测试2.2.1、导出onnx模型2.2.2、c测试代码 2.3、测试统计 3、自定义数据及训练3.1、准备工作3.2、训练3.3、模型重参数化 1、YOLOv9 介绍 YOLOv9 是 YOLOv7 研究团队推出的最新目标检测网络…

MYSQL 是如何保证binlog 和redo log同时提交的?

MYSQL 一个事务在提交的时候能够保证binlog和redo log是同时提交的,并且能在宕机恢复后保持binlog 和redo log的一致性。 先来看看什么是redo log 和binlog,以及为什么要保持它们的一致性。 什么是redo log,binlog redo log是innodb引擎层…

Spring启动“--”设置参数没生效

现象 在idea中启动SpringBoot项目时,使用“--”设置的启动参数没有生效,如修改端口号“--server.port8082” 原因 排查发现是因为在使用SpringApplication.run启动项目时,没有将args参数传入run方法。 修复方案 SpringApplication.run参数中…

【Sql】MVCC有关问题,以及锁,日志和主从复制原理

目录 MVCC 解决什么问题? 实现原理 隐式字段 undo log Read View(读视图) InnoDB 对 MVCC 的实现 锁 分类 锁升级? InnoDB 的行锁? 死锁避免? 乐观锁和悲观锁 日志 主从复制原理 主从复制的作用 MySQL主从复制解决的问题 涉…

面试经典-16- 环形链表

题目 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…

基于springboot实现数据资产管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现数据资产管理系统演示 摘要 固定资产管理系统主要是完成对系统用户管理、资产信息管理、资产变更管理、资产用途管理、资产类别管理和资产增减管理。因为利用本系统管理员可以直接录入信息,修改信息,删除信息,并且若在录入…

vue3 el-form中嵌套el-tabale 对输入动态校验

简单案例 <el-form :model"Form" :rules"rules" ref"FormRef" class"formDiv"><el-table :data"Form.copyWriters" style"width: 100%"><el-table-column label"文案链接"><temp…

3、设计模式之工厂模式2(Factory)

一、什么是工厂模式 工厂模式属于创建型设计模式&#xff0c;它用于解耦对象的创建和使用。通常情况下&#xff0c;我们创建对象时需要使用new操作符&#xff0c;但是使用new操作符创建对象会使代码具有耦合性。工厂模式通过提供一个公共的接口&#xff0c;使得我们可以在不暴露…