仿RabbiteMq实现简易消息队列正式篇(需求分析)
@TOC
目录
MQ的实现方法
RabbitMq中的相关概念
消息队列系统模块划分
总体划分
服务端模块
数据管理模块
虚拟机数据管理模块
交换机路由模块
消费者管理模块
信道(通信)管理模块
连接管理模块
服务端BrokerServer模块
客户端模块
消费者管理模块
信道管理客户端
连接管理模块
基于以上的三个模块封装实现:订阅客户端 / 发布客户端
消息队列中间件是在分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削峰等等问题。实现高性能,高可用,可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。目前常用的消息队列是RabbitMq, KafKa,ZeroMq,MetaMq等。
我们是仿照RabbitMq实现简易的消息队列,就得先了解RabbitMq,RabbitMq是一种开源消息中间件,使用Erlang语言进行开发,实现了高级消息队列协议(AMQP)
MQ的实现方法
MQ的实现方法有两种:AMQP和JMS
- AMQP代表高级消息队列协议,是一个开放的应用层协议标准,用于设计面向消息的中间件。所以我们使用protobuf制作消息。
- JMS即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件的API
JMS是JavaEE规范中的一种,类比JDBC,很多消息中间件都实现了JMS规范,例如:ActiveMQ。RabbitMQ 官方没有提供JMS的实现包,但是开源社区有
RabbitMq中的相关概念
- Broker:接收和分发消息的应用,RabbitMQ Server就是Message Broker
- Virtual host: 出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似网络中的namespace 概念。当多个不同的用户使用同一个RabbitMQ Server提供服务的时,可以划分成多个vhost,每个用户在自己的vhost创建exchange/queue等
- Connection:publisher/consumer和broker之间的TCP连接Channel:如果每一次访问RabbitMQ都建立一次Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低,Channel 是在connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel 进行通信,AMQP method 包含了channel id 帮助客户端和 message broker识别channel, 所以channel 之间是完全隔离的,Channel 作为轻量级的Connection 极大减少了操作系统建立Tcp Connection 的开销
- Exchange:message 到达broker 的第一站, 根据分发规则,匹配查询表中的rounting_key,分发消息到queue中去,常见的类型是direct(直接匹配), topic(主题匹配), fanout(广播匹配)
- Queue:消息最终被送到这里等待consumer取走Binding:exchange 和 queue 之间的虚拟连接,bingding 中可以包含routing key.
- Binding信息被保存到exchange中的查询表中,用于message 的分发依据
接下来说一下我们仿RabbitMq需要实现的东西
消息队列系统模块划分

总体划分
- 服务端
- 发布客户端
- 订阅客户端
服务端模块
数据管理模块
- 交换机数据管理模块
- 队列数据管理模块
- 绑定数据管理模块
- 消息数据管理模块
以上模块分别实现数据的管理以及持久化存储
虚拟机数据管理模块
- 虚拟机其实就是交换机+队列+绑定+消息的整体逻辑单元
- 因此虚拟的数据管理其实就是将以上四个模块的合并管理
交换机路由模块
- 消息的发布,将一条新消息发布到交换机上,由交换机决定放入哪些队列
- 而决定交给哪个队列,其中交换机类型起了很大作用(直接交换,广播交换,主题交换)
- 直接交换和广播交换的思想较为简单,而主题交换设计到了一个规则匹配的流程
- 而交换路由就是专门做匹配过程的
消费者管理模块
- 消费者指的是订阅了一个队列消息的客户端,一旦这个队列有了消息就会推送给这个客户端
- 在核心API中有个订阅消息的服务---这里的订阅不是订阅某条消息,而是订阅某个队列的消息
- 当前主要实现消息推送功能,因此一旦有了消息,就要能找到消费者相关的信息(消费者对应的信道)
信道(通信)管理模块
- 一个连接可能会对应有多个通信通道
- 一旦某个客户端要关闭通信,关闭的不是连接,而是自己对应的通信通道,关闭信道我们就需要将客户端的订阅给取消
连接管理模块
- 就是一个网络通信对应的连接
- 因为当一个连接要关闭的时候,就应该把连接关联的通道全部关闭,因此也有数据至少要管理关联的信道
服务端BrokerServer模块
- 这个模块是将以上所有模块的整合,整合成为一个服务端
客户端模块
消费者管理模块
一个订阅客户端,当订阅一个队列消息的时候,其就相当于创建了一个消费者
信道管理客户端
客户端的信道和服务端的信道是一一对应的,服务端信道提供的服务,客户端都有
相当于服务端向客户端提供服务,客户端为用户提供服务
连接管理模块
对于用户来说,所有的服务都是通过信道完成的,信道在用户的角度就是一个通信通道(而不是连接)
因此所有的请求就是通过信道来完成的
连接的管理就包含了客户端资源的整合
基于以上的三个模块封装实现:订阅客户端 / 发布客户端
订阅客户端:订阅一个队列的消息,收到推送过来的消息进行处理
发布客户端:向一个交换机发布消息。
相关文章:
仿RabbiteMq实现简易消息队列正式篇(需求分析)
TOC 目录 MQ的实现方法 RabbitMq中的相关概念 消息队列系统模块划分 总体划分 服务端模块 数据管理模块 虚拟机数据管理模块 交换机路由模块 消费者管理模块 信道(通信)管理模块 连接管理模块 服务端BrokerServer模块 客户端模块 消费者管…...
Python酷库之旅-第三方库Pandas(082)
目录 一、用法精讲 341、pandas.Series.str.startswith方法 341-1、语法 341-2、参数 341-3、功能 341-4、返回值 341-5、说明 341-6、用法 341-6-1、数据准备 341-6-2、代码示例 341-6-3、结果输出 342、pandas.Series.str.strip方法 342-1、语法 342-2、参数 …...
0101中文乱码-BufferedImage-图片处理
文章目录 1、问题描述2 、电子证书生成3、中文乱码原因及修复4、思考 结语 1、问题描述 接手维护一个休闲赛事类项目,因为服务器到期,项目从云服务器迁移到本地服务器。 项目生成比赛,分为二人组、三人组等等的团体;比赛设置几个…...
[Qt][Qt 事件][下]详细讲解
目录 1.定时器0.是什么?1.QTimerEvent2.QTimer3.获取系统⽇期及时间 2.事件分发器1.概述2.事件分发器工作原理3.使用 3.事件过滤器0.是什么?2.使用 1.定时器 0.是什么? 在进⾏窗⼝程序的处理过程中,经常要周期性的执⾏某些操作&…...
八股总结----计算机网络
0.OSI七层模型 自己的理解:应用层:生成HTTP请求报文-----表示层:将请求报文转换成适合网络传输的数据格式,加密压缩编码等-----会话层:管理两个应用程序之间的会话,包括连接中断等------传输层:…...
Laravel 框架开发 ERP 系统,技术选型和分析以及实施计划
目录 技术选型 技术分析 实施计划 实施步骤 可能需要引入的组件包 技术难点及解决方案 基于 Laravel 框架开发 ERP 系统,技术选型和分析以及实施计划需要考虑多个方面: 技术选型 后端框架:Laravel,因为它提供了丰富的功能…...
【Vue3】嵌套路由
【Vue3】嵌套路由 背景简介开发环境开发步骤及源码 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。本文内…...
pygame小游戏
代码存在一些bug,感兴趣可自行修改,游戏运行后玩法与吃金币游戏类似。(代码及结果比较粗糙,仅供参考) 注:(图片、音乐、音效文件老是上传上传不上,想要可私,也可以自己找…...
.Net Core IIS 程序报错 Access to the path c:\\windows\\TEMP\\poifiles is denied
程序运行报错:Access to the path c:\\windows\\TEMP\\poifiles is denied ,此错误本文介绍两种解决办法,选择适合你的方法即可;一般.Net程序运行方案二可能比较常用。 解决方案一: 从 IIS 访问文件系统 如果您在浏…...
交换机VLAN配置中Tagged与Untagged端口的差异和应用区别
VLAN(虚拟局域网)是一种将局域网设备从逻辑上划分为不同虚拟工作组的技术。它打破了传统局域网在物理位置上的限制,允许网络管理员根据功能、部门或安全需求等因素,将同一物理网络中的设备划分到不同的逻辑网络中。每个VLAN都像一…...
@OneToOne注解的作用
OneToOne 注解在 Java Persistence API (JPA) 中用于定义实体之间的一对一关系。这种关系意味着两个实体之间通过一个唯一键相互关联,即一个实体中的一个字段(通常是主键或唯一字段)对应于另一个实体中的一个字段(也可以是主键或唯…...
vue动画、过渡效果
vue动画、过渡效果 一.动画二.过渡三.多个元素过渡四.第三方库的使用五.总结 一.动画 1.默认.v-enter-active/.v-leave-active, 如果有name则.name-enter-active/.name-leave-active 2.appear意思是一打开页面就 实现动画,是appear"true"的简写 二.过渡 三…...
在 Vue 3 项目中使用 Element UI Plus <el-calendar>组件与时区处理
文章目录 前言简介<el-calendar> 组件组件定制基础自定义内容示例优化点 时区处理时区问题简介获取时区偏移量 下期扩展:自己实现一个<el-calendar> 的思路结语 前言 简介 在 Vue 3 项目开发过程中,我们经常需要对 UI 组件进行定制以满足特…...
【系统架构设计】计算机网络
【系统架构设计】计算机网络 网络架构与协议网络互联模型OSI/RM 结构模型TCP/IP结构模型IPv6 局域网与广域网局域网特点 网络互连与常用设备网络互联设备交换技术路由技术 网络存储技术 网络架构与协议 网络互联模型 OSI/RM 结构模型 1977年,国际标准化组织为适应…...
《中国数据库前世今生》——历史的深度与未来的展望
在探索科技与历史的交织中,我有幸观看了《中国数据库前世今生》这部纪录片。影片开头它不仅是一段技术演进的回顾,更是中国IT领域从跟随到引领的壮丽史诗。后续深刻研读了专家们的深刻讨论,通过这部纪录片,我深刻感受到了数据库技…...
web前端之实现霓虹灯背景魔术卡、旋转的背景动画、模糊效果、边框、变量、filter
MENU 前言效果图htmlstyle 前言 代码段定义一个名为Magic Card的卡片,并通过一系列CSS属性和动画效果来美化和增强该卡片的视觉效果。 效果图 html <div class"card">Magic Card </div>style 代码 property --rotate {syntax: "<a…...
几款免费的时序数据库对比
InfluxDB、TDengine、OpenTSDB、QuestDB都是当前主流的时序数据库,它们在性能、功能、适用场景等方面各有特点。下面将从多个维度对这四个数据库进行对比分析: 一、性能 InfluxDB: 高效的时间序列数据写入性能,自定义TSM引擎&am…...
基于springboot的乐享田园系统
TOC springboot181基于springboot的乐享田园系统 第1章 绪论** 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不…...
深入解析Objective-C中NSParagraphStyle的段落样式处理艺术
标题:深入解析Objective-C中NSParagraphStyle的段落样式处理艺术 在Objective-C的世界中,文本排版是一个复杂但至关重要的话题。NSParagraphStyle作为其中的核心组件,扮演着决定文本段落外观和布局的关键角色。本文将深入探讨NSParagraphSty…...
Qt编程技巧小知识点(2)GPIB缓存区数据读取
文章目录 Qt编程技巧小知识点(2)GPIB缓存区数据读取小结 Qt编程技巧小知识点(2)GPIB缓存区数据读取 大端小端的问题,其主要表现如下例子: 例如:输入为QByteArray str "#14M\xB6q\xC1\n&qu…...
Realistic Vision V5.1虚拟摄影棚效果验证:专业摄影师盲测准确率87.3%
Realistic Vision V5.1虚拟摄影棚效果验证:专业摄影师盲测准确率87.3% 1. 项目概述 Realistic Vision V5.1虚拟摄影棚是基于当前最先进的写实风格生成模型开发的本地化摄影工具。经过深度优化后,该工具能够生成与专业单反相机拍摄效果相媲美的人像作品…...
[OS] 非阻塞键盘输入检测(kbhit)在实时交互应用中的实现与优化
1. 为什么需要非阻塞键盘输入检测? 想象一下你在玩一个简单的终端游戏,比如贪吃蛇。如果游戏在每次等待你按键时都暂停执行,直到你按下某个键才继续,那体验会有多糟糕?这就是阻塞式输入的问题——程序会卡在输入等待环…...
HP-Socket创新项目原型迭代记录:变更、原因与效果
HP-Socket创新项目原型迭代记录:变更、原因与效果 【免费下载链接】HP-Socket High Performance TCP/UDP/HTTP Communication Component 项目地址: https://gitcode.com/gh_mirrors/hp/HP-Socket HP-Socket作为一款高性能TCP/UDP/HTTP通信组件,其…...
OpenClaw技能市场指南:Qwen3.5-4B-Claude适配的20个实用模块
OpenClaw技能市场指南:Qwen3.5-4B-Claude适配的20个实用模块 1. 为什么需要关注技能市场? 第一次接触OpenClaw时,我以为它只是个能执行简单命令的自动化工具。直到在ClawHub技能市场里发现"会议纪要生成器"模块,才意识…...
知识向量化实战指南:从模型选型到混合检索优化
1. 知识向量化的核心价值与应用场景 第一次接触知识向量化这个概念时,我也是一头雾水。直到在医疗知识库项目中亲眼看到"糖尿病治疗"和"血糖控制方案"这两个看似不同的查询,通过向量化后获得了0.92的相似度评分,才真正理…...
uniapp中如何用lottie-miniprogram加载json动画?5分钟搞定炫酷效果
Uniapp中5分钟集成Lottie动画:从原理到实战的完整指南 在移动应用开发中,精美的动画效果往往能显著提升用户体验。对于Uniapp开发者来说,Lottie-miniprogram提供了一种高效的方式,可以直接加载设计师导出的JSON动画文件࿰…...
MAX17332 Arduino库详解:单节锂电池燃料计量与独立充电控制
1. 项目概述 MAX17332 是 Maxim Integrated(现为 Analog Devices)推出的一款高度集成的单节锂离子/锂聚合物电池管理芯片,专为紧凑型便携设备设计。它并非传统意义上的“纯BMS”(Battery Management System)࿰…...
基于comsol的三相电力变压器电磁场与电路耦合计算的电压电流及磁通密度分布分析
comsol三相电力变压器电磁场和电路耦合计算,可以得到变压器高低压绕组电压电流分布以及变压器磁通密度分布三相电力变压器建模这事儿,说难不难说简单也不简单。前两天用COMSOL折腾了个带电路耦合的模型,顺手把绕组电流分布和铁芯磁通都摸清楚…...
大模型赋能金融底稿搜索:告别大海捞针,实现高效精准合规管理!
文章主要介绍了达观数据利用大模型技术升级其底稿搜索产品,为金融行业带来革命性的变化。传统底稿搜索存在关键词匹配局限、非结构化文件解析困难、溯源关联不便和合规风险高等问题。达观数据通过深度语义理解、全格式解析兼容、智能要素抽取、全链路溯源关联和开箱…...
APK Editor Studio:从入门到精通的完整Android应用编辑指南
APK Editor Studio:从入门到精通的完整Android应用编辑指南 【免费下载链接】apk-editor-studio Powerful yet easy to use APK editor for PC and Mac. 项目地址: https://gitcode.com/gh_mirrors/ap/apk-editor-studio 在Android应用开发和逆向工程领域&am…...
