篇章三 需求分析(二)

目录

1.核心API

2.交换机类型

3.持久化

4.网络通信

5.小结


1.核心API

消息队列服务器(Broker Server),要提供的核心API 

1.创建队列(queueDeclare)

此处不使用 Create 这样的术语,而是使用 Declare,是因为:

Create 就只是单纯的“创建”

Declare 起到的效果:不存在就创建,存在就什么都不做

2.销毁队列(queueDelete)

3.创建交换机(exchangeDeclare)

4.销毁交换机(exchangeDelete)

5.创建绑定(queueBind)

6.解除绑定(queueUnbind)

7.发布消息(basicPublish)

8.订阅消息(basicConsume)

9.确认消息(basicAck)

与TCP通过确认应答类似:

        这个API起到的效果,是可以让消费者显式的告诉broker server,这个消息我已经处理完毕了

        提高整个系统的可靠性,保证消息处理没有遗漏

问题:为什么没有消费消息的API?

对于MQ和消费者之间的工作模式,有两种:

1.Push(推) Broker 把收到的数据 ,主动发给订阅的消费者。RabbitMQ只支持 推 的方式。

2.Pull(拉)消费者主动调用Broker 的 API 取数据。Kafka就能支持拉。

2.交换机类型

        交换机在转发消息的时候,有一套转发的规则。提供几种不同的交换机类型(ExchangeType)来描述不同的转发规则。

RabbitMQ主要实现了 四种 交换机类型 (AMPQ协议定义)

1.Direct 直接交换机

2.Fanout 扇出交换机

3.Topic 主题交换机

4.Header 消息头交换机  (规则复杂,应用场景少)

1.Direct直接交换机

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

2.Fanout扇出交换机

        生产者发送消息,交换机收到之后,就把消息转发给绑定的所有队列。

3.Topic主题交换机

关键概念:

1.bindingKey:把队列和交换机绑定的时候,指定一个单词(像一个暗号)

2.routingKey:生产者发送消息的时候,也指定一个单词

如果当前bindingKey和routingKey 能够对上暗号,此时就把这个消息转发到对应的队列里。

3.持久化

        虚拟主机,交换机,队列,绑定,消息等都需要Broker Server 组织管理。所以这些对应的数据需要存储和管理起来。此时内存和硬盘都会各自存储一份,以内存为主,硬盘为辅

内存存储的原因:

        对于MQ来说,能够高效的转发处理数据,是非常关键的指标。因此使用内存来组织上述数据,得到的效率,就比硬盘中高的多。

硬盘存储的原因:

        为了防止内存的数据随着 进程重启/主机重启 丢失。

4.网络通信

其他服务器(生产者/消费者)通过网络,与Broker Server进行交互。

此处采用:TCP + 自定义应用层协议 实现 生产者/消费者 和Broker Server 之间的交互工作

主要工作:

        客户端通过网络调用Broker Server 提供的编程接口,所以客户端这边也要提供上述API,只不过服务器的上述API是真正的业务逻辑,客户端这边仅仅知识发送请求和接收响应。

虽然调用的是本地方法,实际上就像似调用了一个远端服务器方法一样 -> 远程过程调用(RPC

远程过程调用(RPC):

        简单解释:可以视为编写客户端服务器程序,通信过程的一种设计思想。

5.小结

通过需求分析的出具体要做的事情:

1.需要实现生产者 , Broker Server,消费者三部分。

 生产者和消费者,主要编写客户端和服务器的网络通信部分。消费者和生产者具体的业务逻辑并不关心,给客户端一组API,让客户端的业务代码通过网络通信来调用Broker Server上的方法即可。

2.实现Broker Server 以及 Broker Server 内部的一些基本概念和核心API

3.持久化

把上述这些关键数据,在硬盘中的存储。

解决存储在数据库/文件中,以及后续服务器重启重新获取上述数据的问题。

最终目标:

实现一个分布式系统下的生产者消费者模型(不支持分布式部署功能),只是一个单机的Broker Server,但是能给多个生产者消费者服务。

专业的 MQ 都是支持集群的

优点:

1.提高可用性

2.处理更高的并发

3.数据互相备份

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

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

相关文章

打造高效数据处理利器:用Python实现Excel文件智能合并工具

有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析。今天,我想分享一个使用Python开发的小工具,它可以帮助我们轻松实现Excel文件的智能合并。C:\pythoncode\new\xlsx_merger.…

StepX-Edit:一个通用图像编辑框架——论文阅读笔记

一. 前言 代码:https://github.com/stepfun-ai/Step1X-Edit 论文:https://arxiv.org/abs/2504.17761 近年来,图像编辑技术发展迅速,GPT- 4o、Gemini2 Flash等前沿多模态模型的推出,展现了图像编辑能力的巨大潜力。 这…

第9.1讲、Tiny Encoder Transformer:极简文本分类与注意力可视化实战

项目简介 本项目实现了一个极简版的 Transformer Encoder 文本分类器,并通过 Streamlit 提供了交互式可视化界面。用户可以输入任意文本,实时查看模型的分类结果及注意力权重热力图,直观理解 Transformer 的内部机制。项目采用 HuggingFace …

【Java】泛型在 Java 中是怎样实现的?

先说结论 , Java 的泛型是伪泛型 , 在运行期间不存在泛型的概念 , 泛型在 Java 中是 编译检查 运行强转 实现的 泛型是指 允许在定义类 , 接口和方法时使用的类型参数 , 使得代码可以在不指定具体类型的情况下操作不同的数据类型 , 从而实现类型安全的代码复用 的语言机制 . …

linux如何查找软连接的实际地址

在Linux系统中,查找软连接(符号链接,即symbolic link)的实际地址可以通过多种方法实现。软连接是一个特殊的文件类型,它包含了一个指向另一个文件或目录的引用。要找到软连接所指向的实际文件或目录,可以使…

Token类型与用途详解:数字身份的安全载体图谱

在现代数字身份体系中,Token如同"数字DNA",以不同形态流转于各类应用场景。根据Okta的最新研究报告,平均每个企业应用使用2.7种不同类型的Token实现身份验证和授权。本文将系统梳理主流Token类型及其应用场景,通过行业典…

火山 RTC 引擎9 ----集成 appkey

一、集成 appkey 1、网易RTC 初始化过程 1)、添加头文件 实现互动直播 - 互动直播 2.0网易云信互动直播产品的基本功能包括音视频通话和连麦直播,当您成功初始化 SDK 之后,您可以简单体验本产品的基本业务流程,例如主播加入房间…

详细介绍Qwen3技术报告中提到的模型架构技术

详细介绍Qwen3技术报告中提到的一些主流模型架构技术,并为核心流程配上相关的LaTeX公式。 这些技术都是当前大型语言模型(LLM)领域为了提升模型性能、训练效率、推理速度或稳定性而采用的关键组件。 1. Grouped Query Attention (GQA) - 分组…

光电效应理论与实验 | 从爱因斯坦光量子假说到普朗克常量测定

注:本文为“光电效应”相关文章合辑。 英文引文,机翻未校。 中文引文,略作重排,未整理去重。 图片清晰度受引文原图所限。 如有内容异常,请看原文。 Photoelectric Effect 光电效应 Discussion dilemma Under the…

Visual Studio 2019/2022:当前不会命中断点,还没有为该文档加载任何符号。

1、打开调试的模块窗口,该窗口一定要在调试状态下才会显示。 vs2019打开调试的模块窗口 2、Visual Studio 2019提示未使用调试信息生成二进制文件 未使用调试信息生成二进制文件 3、然后到debug目录下看下确实未生成CoreCms.Net.Web.WebApi.pdb文件。 那下面的…

打破性能瓶颈:用DBB重参数化模块优化YOLOv8检测头

文章目录 引言DBB 重参数化模块简介DBB 的优势 YOLOv8 检测头的结构分析使用 DBB 模块魔改检测头替换策略代码实现改进后的效果预期 实验与验证总结与展望 引言 在目标检测领域,YOLO 系列算法一直以其高效的检测速度和不错的检测精度受到广泛关注。随着版本的不断更…

如何成为更好的自己?

成为更好的自己是一个持续成长的过程,需要结合自我认知、目标规划和行动力。以下是一些具体建议,帮助你逐步提升: 1. 自我觉察:认识自己 反思与复盘:每天花10分钟记录当天的决策、情绪和行为,分析哪些做得…

免费使用GPU的探索笔记

多种有免费时长的平台 https://www.cnblogs.com/java-note/p/18760386 Kaggle免费使用GPU的探索 https://www.kaggle.com/ 注册Kaggle账号 访问Kaggle官网,使用邮箱注册账号。 发现gpu都是灰色的 返回home,右上角的头像点开 验证手机号 再次code-you…

CSS- 4.2 相对定位(position: relative)

本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 HTML系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看! 点…

如何使用Antv X6使用拖拽布局?

拖拽效果图 拖拽后 布局预览 官方: X6 图编辑引擎 | AntV 安装依赖 # npm npm install antv/x6 --save npm install antv/x6-plugin-dnd --save npm install antv/x6-plugin-export --save需要引入的代码 import { Graph, Shape } from antv/x6; import { Dnd } …

数据库健康监测器(BHM)实战:如何通过 HTML 报告识别潜在问题

在数据库运维中,健康监测是保障系统稳定性与性能的关键环节。通过 HTML 报告,开发者可以直观查看数据库的运行状态、资源使用情况与潜在风险。 本文将围绕 数据库健康监测器(Database Health Monitor, BHM) 的核心功能展开分析,结合 Prometheus + Grafana + MySQL Export…

PCB设计实践(二十四)PCB设计时如何避免EMI

PCB设计中避免电磁干扰(EMI)是一项涉及电路架构、布局布线、材料选择及制造工艺的系统工程。本文从设计原理到工程实践,系统阐述EMI产生机制及综合抑制策略,覆盖高频信号控制、接地优化、屏蔽技术等核心维度,为高密度、…

嵌入式硬件篇---陀螺仪|PID

文章目录 前言1. 硬件准备主控芯片陀螺仪模块电机驱动电源其他2. 硬件连接3. 软件实现步骤(1) MPU6050初始化与数据读取(2) 姿态解算(互补滤波或DMP)(3) PID控制器设计(4) 麦克纳姆轮协同控制4. 主程序逻辑5. 关键优化与调试技巧(1) 传感器校准(2) PID参数整定先调P再调D最后…

【Linux基础I/O】文件调用接口、文件描述符、重定向和缓冲区

【Linux基础I/O一】文件描述符和重定向 1.C语言的文件调用接口2.操作系统的文件调用接口2.1open接口2.2close接口2.3write接口2.4read接口 3.文件描述符fd的本质4.标准输入、输出、错误5.重定向5.1什么是重定向5.2输入重定向和输出重定向5.3系统调用的重定向dup2 6.缓冲区 1.C语…

鸿蒙HarmonyOS 【ArkTS组件】通用属性-背景设置

📑往期推文全新看点(附带最新鸿蒙全栈学习笔记) 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~ 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选? 分享一场鸿蒙开发面试经验记录(三面…