当前位置: 首页 > news >正文

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 介绍项目/ 需求分析

文章目录

  • 一、消息队列是什么?
  • 二、需求分析
    • 结构解析
    • 功能解析
    • 规则解析
      • 绑定关系
      • 交换机类型
      • 消息应答
  • 三、持久化存储
  • 四、网络通信
    • 提供的API
    • 复用TCP连接
  • 五、消息队列概念图


一、消息队列是什么?


消息队列 (Message Queue, MQ)就是将阻塞队列这一数据结构提取成了一个独立程序,故消息队列也是一个生产者消费者模型.

生产者消费者模型的作用:

1️⃣解耦合:
如果是客户端A直接调用服务器B,那么客户端A与服务器B的代码耦合度就比较高,更改任意一方的代码,可能另一方的代码都会随之受到牵连而也需要改写.

而如果是客户端A将请求发送至生产者消费者模型,服务器B再从中取出,此时A和B的代码耦合度就低,就不会出现牵一发而动全身这样麻烦的情况了.

2️⃣削峰填谷:
服务器C,业务逻辑比较复杂,无法同时处理很多的请求,如果此时有多个客户端向服务器C发送请求,那么服务器C就有挂掉的风险.
引入消息队列后,让所有的客户端都将请求发送到消息队列中,服务器从消息队列中取,
在客户端请求较多时,仍让服务器收到的请求保持在安全数量,即达到削峰效果.
在服务器较为空闲时,仍可以让其从消息队列中获取请求,达到填谷效果.
以此来降低因请求过多而让服务器挂掉的风险.

使用场景:

双十一的时候,淘宝客户端会产生大量订单,客户端将订单提交到服务器,此时服务器就会面临大量订单,那么服务器面对远超自己承受能力的庞大数据量,可能就会挂掉.

此时就可以引入 生产者消费者模型 >>> 消息队列,让淘宝客户端的订单,发送到消息队列,再让服务器根据自己的承受能力自行取订单.


二、需求分析

此处咱们编写的消息队列,主要参考市面上比较知名的消息队列 RabbitMQ.
消息队列的核心功能主要有两个:
1️⃣让生产者将需要转发的数据(称之为消息)存储到消息队列中.
2️⃣让消费者将需要取出的消息,从消息队列中取出
在这里插入图片描述

此处的消息队列会有N多个生产者,N多个消费者,其中Borker Server 最为重要,是用来存储和转发消息的.


根据上述要实现的两个核心功能就提取出了六个核心概念:
1️⃣生产者(Producer):生产消息的一方

2️⃣消费者(Consumer):消费消息的一方

3️⃣中间人(Broker):存放消息的一方

4️⃣发布消息(Publish):生产者将生产出的消息,存放到中间人处的功能.

5️⃣订阅消息(Subscribe):消费者订阅中间人此处的某些消息的功能.

6️⃣消费消息(Consume):服务器将消息推送给订阅的消费者的功能.


结构解析

前三个概念是比较好理解的,那我们就来剖析一下后三个功能.

让我们先来看看RabbitMQ的内部结构

在这里插入图片描述

上述结构遵循了AMPQ协议.

Broker Server内部的结构有多个<虚拟机>.

虚拟机:类似于MySQL中的 batabase,是一组数据的逻辑集合.

交换机:生产者投递消息到 Broker Server 实际上,是把消息投递到某个交换机,再由交换机把自身的规则把消息转发给对应的队列.

消息队列:真正用来存储消息的实体.

Binding绑定关系:记录交换机与队列之间的绑定关系.


功能解析

发布消息功能:其实就是生产者将消息发送给对应的交换机,交换机再根据不同的转发规则,转发给与之相绑定且符合规则的消息队列.

订阅消息功能:其实就是消费者去某个消息队列处注册,表明自己要从这个消息队列中取消息,这个注册称之为订阅.(此处的订阅消息就好像是在抖音上给一个博主点了关注,)

消费消息功能:其实就是当消息队列中有消息时,自动向在这个消息队列注册过的消费者推送信息.(当你关注的博主发布新视频时,便会自动将视频推送给你)


规则解析

上述三个功能中有两个核心规则:
1️⃣让生产者的消息正确存储到对应队列的规则(姑且称为正确存储规则).

2️⃣保证将消息转发到对应的消费者手中的规则,而没有在网络上丢失(姑且称为正确转发规则).

正确存储规则要如何实现呢?
发布消息的本质是将消息到交换机,再由对应的交换机存储到与之绑定且符合转发规则的队列中.
故正确存储规则的实现主要依靠
绑定关系 与 交换机的类型.

绑定关系

绑定关系本质上是给 交换机 与 消息队列 通过 一个绑定钥匙进行绑定.
所以绑定关系本质上只有三个字段,
exchangeName(交换机名称),queueName(消息队列名称),bindingKey(绑定钥匙).
在这里插入图片描述

在不同的交换机类型中bindingKey也起到不同的作用.


交换机类型

发送消息到交换机时,一共会提交三个参数,
1.消息,2.交换机名称,3.routingKey
交换机共有四种类型:

Direct类型
Fanout类型
Topic类型

Header类型(其中 Header 这种方式比较复杂, 比较少见. 常用的是前三种交换机类型. 咱们此处也主要实现这三种)

Direct类型(直接交换机): 生产者向该类型交换机发送消息时, 直接指定队列名称,无视绑定关系.(即指定的队列与该交换机有没有绑定都可以)

在这里插入图片描述

Fanout类型(扇出交换机):生产者发送的消息会被发送到所有与该交换机存在绑定关系的队列中.
在这里插入图片描述

Topic类型(主题交换机): 发送消息指定⼀个字符串为 routingKey. 然后去绑定关系表中去查找与该交换机绑定的队列,并且与绑定关系中的 bindingKey匹配成功才发送到这个队列中.(匹配算法后续讲解)

在这里插入图片描述


正确转发规则要如何实现呢?
其实很简单,让消费者拿到消息后,告诉服务器一声就ok了,也就是消息应答.


消息应答

应答模式分成两种.
自动应答 : 消费者只要消费了消息, 就算应答完毕了. Broker 直接删除这个消息.(等于没应答)
手动应答 : 消费者手动调用应答接口, Broker Server 收到应答请求之后, 才真正删除这个消息.

手动应答的目的, 是为了保证消息确实被消费者处理成功了. 在⼀些对于数据可靠性要求高的场景, 比较常见.


三、持久化存储

Exchange交换机, Queue消息队列, Binding绑定关系, Message消息 都有持久化的需求.
以保证当程序重启 / 主机重启, 上述内容不丢失.

这就需要我们将这些数据存储到硬盘中,这样当程序重启/主机重启时,才不会丢失数据.

但是为了保证 咱们这个《消息队列》程序能够高效的转发处理数据,所以这些数据也要在内存中存储一份,
并且每次重启后,都要将硬盘的数据读取恢复到内存中.


四、网络通信

⽣产者和消费者都是客户端程序, broker Server 则是作为服务器. 通过网络进⾏通信.
在⽹络通信的过程中, 客户端部分要提供对应的 api, 来实现对服务器的操作.

以生产者创建交换机举例:
在这里插入图片描述

提供的API

创建交换机 (exchangeDeclare)
销毁交换机 (exchangeDelete)
创建队列 (queueDeclare)
销毁队列 (queueDelete)
创建绑定 (queueBind)
解除绑定 (queueUnbind)
发布消息 (basicPublish)
订阅消息 (basicConsume)
确认消息 (basicAck)

上述这9个API是服务器和客户端都有的,

客户端的这些API让客户使用 RPC 远程调用服务器上的方法.
服务器的这些API则是实现各种操作的.


复用TCP连接

还有4个API是提供网络连接支持的
创建 Connection (创建TCP连接)
关闭 Connection (销毁TCP连接)
创建 Channel (创建逻辑连接)
关闭 Channel (销毁逻辑链接)

一个Connection对象代表一个TCP连接.

Channel 则是 Connection 中的逻辑通道.
⼀个 Connection 中可以包含多个 Channel.
Channel 和 Channel 之间的数据是独立的. 不会相互干扰.

这样的设定主要是为了 客户端在短时间多次远程调用 Broker Server 的 API时,减少频繁创建销毁TCP连接的资源开销,更好的复用 TCP 连接, 达到长连接的效果

此时就可以将 Connection 理解成教学楼,Channel理解为教室,一栋教学楼里可以有多个教室,且每个教室互不干扰.


五、消息队列概念图

在这里插入图片描述

相关文章:

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 介绍项目/ 需求分析

文章目录 一、消息队列是什么&#xff1f;二、需求分析结构解析功能解析规则解析绑定关系交换机类型消息应答 三、持久化存储四、网络通信提供的API复用TCP连接 五、消息队列概念图 一、消息队列是什么&#xff1f; 消息队列 (Message Queue, MQ)就是将阻塞队列这一数据结构提取…...

Python学习之索引与切片

Python学习之索引与切片 s “0abcdefghijklmnopqrstuvwxyz”&#xff0c;第一个元素‘0’&#xff0c;索引号为0&#xff0c;最后一个元素‘z’&#xff0c;索引号为26 1. s[0]获取索引号为0的元素 2. s[1:3]获取索引号为1的元素&#xff0c;直到但不包括索引号为3的元素。即…...

编程每日一练(多语言实现)基础篇:满足abcd=(ab+cd)^2的数 (增加Go语言实现)

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现3.4 JavaScript 语言实现3.5 Go 语言实现 一、实例描述 假设 abcd 是一个四位整数&#xff0c;将它分成两段&#xff0c;即 ab 和 cd&#xff0c;使之相加求和后再平方。求满…...

LeetCode 热题 HOT 100:回溯专题

LeetCode 热题 HOT 100&#xff1a;https://leetcode.cn/problem-list/2cktkvj/ 文章目录 17. 电话号码的字母组合22. 括号生成39. 组合总和46. 全排列补充&#xff1a;47. 全排列 II &#xff08;待优化)78. 子集79. 单词搜索124. 二叉树中的最大路径和200. 岛屿数量437. 路径…...

喝健康白酒 有益生心健康

中国的制酒史源远流长&#xff0c;酒渗透在中华五千年的文化中。酒与烟不同&#xff0c;烟对人体有百害而无一利&#xff0c;而对于酒&#xff0c;若掌握好饮酒的度&#xff0c;对人体有一定的养生作用&#xff0c;所以我们通常会说“戒烟限酒”。 据一些专家研究&#xff0c;…...

动态规划:两个数组的dp问题(C++)

动态规划&#xff1a;两个数组的dp问题 前言两个数组的dp问题1.最长公共子序列&#xff08;中等&#xff09;2.不同的子序列&#xff08;困难&#xff09;3.通配符匹配&#xff08;困难&#xff09;4.正则表达式&#xff08;困难&#xff09;5.交错字符串&#xff08;中等&…...

BASH shell脚本篇2——条件命令

这篇文章介绍下BASH shell中的条件相关的命令&#xff0c;包括&#xff1a;if, case, while, until, for, break, continue。之前有介绍过shell的其它基本命令&#xff0c;请参考&#xff1a;BASH shell脚本篇1——基本命令 1. If语句 if语句用于在顺序执行语句的流程中执行条…...

【图论C++】Floyd算法(多源最短路径长 及 完整路径)

>>>竞赛算法 /*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在算法竞赛学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记&#xff…...

小谈设计模式(11)—模板方法模式

小谈设计模式&#xff08;11&#xff09;—模板方法模式 专栏介绍专栏地址专栏介绍 模板方法模式角色分类抽象类&#xff08;Abstract Class&#xff09;具体子类&#xff08;Concrete Class&#xff09;抽象方法&#xff08;Abstract Method&#xff09;具体方法&#xff08;C…...

C#程序中很多ntdll.dll、clr.dll的线程

如下图 需要“右键工程——调试——取消勾选‘启用本地代码调试’”即可。...

低代码工作流程管理系统:提升企业运营效率的利器

业务运营状况是否良好&#xff0c;除了人员需要配合以外&#xff0c;真正发挥作用的是背后的工作流程。将重复的工作进行自动化处理&#xff0c;确保这些流程最终指向同一个目标、实现一致的运营结果。而设计和实施不佳的工作流程则产生相反的效果——导致处理时间延长、运营成…...

HIVE SQL regexp_extract和regexp_replace配合使用正则提取多个符合条件的值

《平凡的世界》评分不错&#xff0c;《巴黎圣母院》改变成的电影不错&#xff0c;还有<<1984>>也蛮好看。 如何使用regexp_extract&regexp_replace函数将以上文本中所有书籍名称都提取出来&#xff1f; select substr(regexp_replace(regexp_extract(regexp_…...

debian 安装matlab2022b报错解决方法与问题解决思路

报错 terminate called after throwing an instance of ‘std::runtime_error’ 在安装目录执行 ./bin/glnxa64/MATLABWindow通过执行以上命令发现是和libharfbuzz库有关。 该库在调用freetype库时&#xff0c;有方法找不到。 偿试remove freetype库&#xff0c;发现该库有大…...

Jenkins集成AppScan实现

一、Jenkins上安装插件 在Jenkins里安装以下插件 ibm-security-appscanstandard-scanner 二、打开AppScan 1、配置需要扫描的地址 配置需要扫描的地址 2、记录好要扫描的URL登录序列 记录好要扫描的URL登录序列 3、导出要扫描的URL登录序列设置 导出要扫描的URL登录序列设置 三…...

10.1 File类

前言&#xff1a; java.io包中的File类是唯一一个可以代表磁盘文件的对象&#xff0c;它定义了一些用于操作文件的方法。通过调用File类提供的各种方法&#xff0c;可以创建、删除或者重命名文件&#xff0c;判断硬盘上某个文件是否存在&#xff0c;查询文件最后修改时间&…...

[论文笔记]UNILM

引言 今天带来论文Unified Language Model Pre-training for Natural Language Understanding and Generation的笔记,论文标题是 统一预训练语言模型用于自然语言理解和生成。 本篇工作提出了一个新的统一预训练语言模型(Unifield pre-trained Language Model,UniLM),可以同…...

LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略

LLM之Colossal-LLaMA-2&#xff1a;Colossal-LLaMA-2的简介、安装、使用方法之详细攻略 导读&#xff1a;2023年9月25日&#xff0c;Colossal-AI团队推出了开源模型Colossal-LLaMA-2-7B-base。Colossal-LLaMA-2项目的技术细节&#xff0c;主要核心要点总结如下: >> 数据处…...

国庆作业2

select实现服务器并发 代码&#xff1a; #include <myhead.h>#define ERR_MSG(msg) do{\printf("%d\n",__LINE__);\perror(msg);\ }while(0)#define PORT 8888#define IP "192.168.1.5"int main(int argc, const char *argv[]) {//创建流式套接字…...

fork仓库的代码如何同步主仓库代码

1.背景 我fork了一份 jekyll-theme-chirpy 仓库的代码(基于 jekyll 的自建博客仓库&#xff0c;可以免服务器)&#xff0c;我需要在上面更新我的博客文章&#xff0c;但是我又想一直同步 jekyll-theme-chirpy 仓库的新功能&#xff0c;这样我可以更新自己的博客功能。所以我就…...

【Axure】元件库和母版、常见的原型规范、静态原型页面制作

添加现有元件库 点击元件库——载入 当然也可以创建元件库&#xff0c;自己画自己保存 建立京东秒杀母版 静态原型页面的制作 框架 选择以iphone8的界面大小为例&#xff0c;顶部状态栏高度为20 左侧类似于标尺&#xff0c;因为图标、文字离最左侧的间距是不一样的 信…...

在设备树中描述中断

参考文档&#xff1a; 内核 Documentation\devicetree\bindings\interrupt-controller\interrupts.txt 在设备树中&#xff0c;中断控制器节点中必须有一个属性&#xff1a; interrupt-controller&#xff0c;表明它是“中断控制器”。 还必须有一个属性&#xff1a; #interru…...

ccf_csp第一题汇总

ccf_csp第一题汇总 printf()输出格式大全&#xff08;附 - 示例代码&#xff09;现值计算AcWing 4699. 如此编码AcWing 4509. 归一化处理(小数位数根号函数)AcWing 4454. 未初始化警告AcWing 4280. 序列查询AcWing 4006. 数组推导(小陷阱)AcWing 3292. 称检测点查询AcWing 3287…...

uniapp 实现下拉筛选框 二次开发定制

前言 最近又收到了一个需求&#xff0c;需要在uniapp 小程序上做一个下拉筛选框&#xff0c;然后找了一下插件市场&#xff0c;确实有找到&#xff0c;但不过他不支持搜索&#xff0c;于是乎&#xff0c;我就自动动手&#xff0c;进行了二开定制&#xff0c;站在巨人的肩膀上&…...

实现单行/多行文本溢出

在日常开发展示页面&#xff0c;如果一段文本的数量过长&#xff0c;受制于元素宽度的因素&#xff0c;有可能不能完全显示&#xff0c;为了提高用户的使用体验&#xff0c;这个时候就需要我们把溢出的文本显示成省略号。 一. 单行文本溢出 即文本在一行内显示&#xff0c;超出…...

Spring Boot中的Binder类

介绍 Spring Boot中的Binder类是一个用于绑定属性的工具类。它可以将配置文件中的属性值绑定到Java对象中&#xff0c;从而方便地进行配置管理。 简单示例 import org.springframework.boot.context.properties.bind.Binder; import org.springframework.core.env.Environmen…...

leetcode之打家劫舍

leetcode 198 打家劫舍 leetcode 213 打家劫舍 II leetcode 337. 打家劫舍 III 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#…...

走进Spring的世界 —— Spring底层核心原理解析(一)

文章目录 前言一、Spring中是如何创建一个对象二、Bean的创建过程三、推断构造方法四、AOP大致流程五、Spring事务 前言 ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext("config.xml"); UserService userService (UserService) cont…...

快看看你的手机有没有:谷歌Android全面封杀此类软件!

谷歌坐不住了&#xff0c;因为Android应用商店中&#xff0c;充斥着大量可窃取用户数据的应用&#xff0c;所以必然要出手整治了。 一款名叫“SonicSpy”软件是整个事情的导火索&#xff0c;而该应用是典型的窃取用户数据的应用&#xff0c;其除了可以从手机中提取个人数据外&…...

spark ui 指南

spark ui 指南 1.sparkUI 基本介绍2.jobs页面3.stages 页面4.storage 页面5.environment 页面6.ececutor 页面7 sql 页面  spark ui 是反应一个spark 作业执行情况的页面,通过查看作业的执行情况,分析作业运行的状态. 1.sparkUI 基本介绍 进入运行主页面如下,主要有6各部…...

【分布式事务】

文章目录 解决分布式事务的思路seata四种模式1. XA模式2. AT模式AT模式与XA模式的区别是什么&#xff1f;脏写问题 3. TCC模式事务悬挂和空回滚 4. SAGA模式 四种模式对比口述AT模式与TCC模式高可用 什么是分布式事务&#xff1f; 分布式事务&#xff0c;就是指不是在单个服务或…...

电商类网站建设/代做百度首页排名价格

应用篇&#xff08;常用命令&#xff09; 用户&#xff1a;useradd,userdel usermod passwd 用户组&#xff1a;groupadd groupdel groupmod gpasswd(修改用户组的用户) 查询&#xff1a;groups id 只要记得关键词&#xff0c;其它需要用时直接man 查询就好啦 甚至只需要记得u…...

wordpress代码检查工具/app注册接单平台

我这里实验使用的工具是&#xff1a;linux系统版本-红帽6.5企业版&#xff0c;MySQL数据库版本-mysql-5.5.38一.准备工作&#xff1a;1.为了避免端口冲突、程序冲突等现象&#xff0c;建议先将使用rpm方式安装的mysql、mysql-server软件包卸载说明&#xff1a;rpm -q是为了查询…...

企业vi设计需求/网络优化培训要多少钱

RNIF BAM Tracking Error&#xfffc; 解决办法&#xff1a;&#xfffc; 503: Service Unavailable&#xfffc; &#xfffc; 解决办法&#xff1a;IIS 应用程序池运行账户用户名或密码错误&#xff0c;用户名不能是domain\username格式&#xff0c;直接使用username public …...

青岛建设网站公司/百度一下打开网页

我们最新出版的一本有争议的书名 &#xff0c;比起谷仓舞中的一桶青蛙引起了更多的辩论和更多的下意识的反应。 我经常看到的一句话是“用显示为表格的div替换table标签没有什么不同&#xff1b; 您也可以只使用表格。” 该参数很有趣&#xff0c;因为它听起来像注释者暗示不使…...

网站开发项目实训总结/朝阳网站建设

精品文档师徒结对活动徒弟听课记录表时间班 级过程即时感 悟课题教学过程实录过程即时感 悟教学过程实录板书或场地听课心得体会师傅评价与签名师徒结对活动师傅课记录表时间班 级过程即时评 价课题教学过程实录过程即时评 价教学过程实录板书或场地课后点评其他指导记录时间活…...

net的网站建设/网络营销就业前景和薪水

摘 要 I ABSTRACT II 第1章 绪论 1 1.1选题背景及意义 1 1.1.1选题背景 1 1.1.2选题意义 1 1.1.3国内外研究现状 2 1.2需求分析 3 1.2.1建设背景 3 1.2.2总体建设目标 4 1.2.4具体实施目标 5 1.3校园无线网在教育中的发展 6 第2章 无线网络的应用 7 2.1 无线网络的概述 7 2.1.1…...