基于RabbitMQ的模拟消息队列需求文档
文章目录
- 一、项目背景
- 二、需求分析
- 1.核心概念
- 2.BrokerServer核心组件
- 3.核心API
- 4.交换机类型
- 5.持久化
- 6.网络通信
- 7.消息应答
- 三、消息队列模块划分
一、项目背景
什么是消息队列?
消息队列就是,基于阻塞队列,封装成一个独立的服务器程序,实现跨主机使用生产者-消费者模型。生产者生产消息到消息队列,消费者从消息队列消费数据。
二、需求分析
1.核心概念
- 生产者(Producer):生产消息的客户端
- 消费者 (Consumer) :消费消息的客户端
- 中间人 (Broker):消息队列服务器
- 发布 (Publish):生产者发送消息给中间人
- 订阅 (Subscribe) :要消费消息的消费者
- 消费 (Consume):消费者从中间人读取消息
Producer Client:生产者客户端
Broker Server:消息队列服务器
Consumer Client:消费者客户端
Publish Message:生产消息
Subscribe Messge:订阅消息
2.BrokerServer核心组件
- 虚拟主机(VirtualHost):类似于MySQL的dataBase,用来区分不同组的业务。
- 交换机(Exchange):生产者发送消息给BrokerServer,实际上是给某个交换机发送消息,交换机再把消息转发给队列。
- 队列(Queue):存储消息
- 绑定(Binding):交换机和队列之间的绑定关系(多对多)
- 消息(Message):传递的内容
3.核心API
- 创建交换机(exchangeDeclare)
- 删除交换机(exchangeDelete)
- 创建队列(queueDeclare)
- 删除队列(queueDelete)
- 创建绑定(queueBind)
- 删除绑定(queueUnbind)
- 发布消息(basicPublish)
- 订阅消息(basicConsume)
注意,消费者得到服务器中的消息有两种方式:
一种是消费者主动从服务器中取。
一种是服务器推送消息给消费者。这里的订阅消息,只支持服务器推送消息给消费者。
- 确认消息(basicAck)
消费者主动告诉消息队列已经收到消息了。(成功确认)
4.交换机类型
- 直接交换机 (Direct Exchange)
根据队列名查找队列,如果存在,转发消息;不存在,就把消息丢弃。 - 扇出交换机(Fanout Exchange)
转发消息至该交换机绑定的所有队列。 - 主题交换机(Topic Exchange)
交换机和队列绑定的时候,绑定关系中带有一个bindingKey(上联)。发送消息的时候,消息带有一个routingKey(下联)。在该交换机绑定的所有队列中查找,如果routingKey和bindingKey对上的话,就转发给该队列。没有,就丢弃消息。
5.持久化
当服务器重启后,内存的数据都会丢失。这个时候,需要通过持久化来保证数据不丢失。通过将数据保存到硬盘上来实现持久化。
- 交换机、队列、绑定通过数据库来管理
- 消息通过二进制的格式保存到文件中,重启后,从文件中读取数据到内存。
(序列化/反序列化)
6.网络通信
生产者和消费者都是客户端,需要通过网络与服务器进行交互。这里的通信协议是基于TCP的自定义应用层协议。
在网络通信过程中,客户端要提供对应API,通过调用这个API来远程调用服务器的API,实现对服务器的操作。
客户端这边除了对应服务器的方法外,还需要实现其他的方法。
- 创建Connection(newConnection)
- 销毁Connection(close)
一个Connetion对象视作一次TCP连接。
- 创建Channel (createChannel)
- 销毁Channel(close)
Channel是一次逻辑上的连接。一个Connection里包含多个Channel。连接/断开TCP的成本太高。但是客户端和服务器的交互业务很多,所以通过多个Channel,传输不同的数据(channel之间互不相干),达到复用TCP的效果。
7.消息应答
- 服务器推送消息给消费者的时候,自动确认。
- 消费者手动调用basicAck这个方法。
三、消息队列模块划分
相关文章:

基于RabbitMQ的模拟消息队列需求文档
文章目录 一、项目背景二、需求分析1.核心概念2.BrokerServer核心组件3.核心API4.交换机类型5.持久化6.网络通信7.消息应答 三、消息队列模块划分 一、项目背景 什么是消息队列? 消息队列就是,基于阻塞队列,封装成一个独立的服务器程序&#…...

“北科Java面试宝典(211最详细讲解)“
Version : V1.0 北科Java面试宝典一、Java基础面试题【24道】二、JVM虚拟机面试题【14道】三、集合相关面试题【17道】四、多线程 【25道】五、IO【5道】六、网络编程 【9道】七、MySQL以及SQL面试题【20道】八、常用框架【19道】九、中间件和分布式 【54道】十、设计模式面试 …...

自动化测试工具Selenium的语法续.
OK,那么上篇博客我们介绍了如何搭建基于Javaselenium的环境,并且使用selenium的一些语法给大家演示了如何进行自动化测试的案例,那么本篇博客我们来继续学习selenium的一些其他的比较重要的语法,感谢关注,期待三连~ 目…...

稳恒电路直观理解
图v0 图v1 图v2 图v3 图v4 自由正电荷s,定向移动过程中,在任何一位置处受力都是平衡的,即s所受总合力为0, 即s处于匀速运动:直导体中匀速直线运动、拐弯处匀速圆周运动 起初t0时刻, s的势能是最高的E0,之…...

LeetCode面试经典150题(day 3)
169. 多数元素 难度:简单 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums …...

掌握这个工具,轻松管理所有物流信息
在电子商务高度发达的今天,物流快递行业在全球范围内发挥着至关重要的作用。然而,在如此复杂的物流环境中,快递退回件的管理和查询成为了一个难题。为了解决这个问题,我们有一个神奇的工具——快递批量查询高手。 快递批量查询高…...

1.Python操作txt文本
文章目录 1.Python读取一个txt文件的内容并将其写入到另一个txt文件2.Python读取一个未知编码的文件并将其设置为指定编码格式3.Python实现txt文件中字符串的替换 1.Python读取一个txt文件的内容并将其写入到另一个txt文件 # -*- encoding:gb2312 -*- import chardetdef read_…...

Redis 主从复制和哨兵模式
一、概念 主从复制,是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower)。数据的复制是单向的,只能由主节点…...

【已解决】在 SpringBoot 中使用 CloseableHttpClient 调用接口时,接收参数中的中文变为“?“
问题描述 由于项目需要,需要在代码中使用POST请求去调用另一个服务的接口,即不通过前端,A 项目直接在方法中发起HTTP请求调用 B 项目的接口,当请求体中的参数有中文时,参数接收后中文会变为“?”。 具体原因是参数的…...

研磨设计模式day15策略模式
场景 问题描述 经常会有这样的需要,在不同的时候,要使用不同的计算方式。 解决方案 策略模式 定义: 解决思路:...

Densenet模型详解
模型介绍 DenseNet的主要思想是密集连接,它在卷积神经网络(CNN)中引入了密集块(Dense Block),在这些块中,每个层都与前面所有层直接连接。这种设计可以让信息更快速地传播,有助于解…...

华为eNSP模拟器中,路由器如何添加serial接口
在ensp模拟器中新建拓扑后,添加2个路由器。 在路由器图标上单击鼠标右键,选择设置选项。 在【视图】选项卡的【eNSP支持的接口卡】窗口查找serial接口卡。 选择2SA接口卡,将其拖动到路由器空置的卡槽位。 如上图所示,已经完成路由…...
Linux脚本- 执行当前文件下前500个.c文件,并将每个文件对应的执行结果重定向到同名的.ok文件中
需求:执行当前文件下前500个.c文件,并将每个文件对应的执行结果重定向到同名的.ok文件中 以下是一个用于实现该功能的 Bash 脚本。 #!/bin/bash# 计数器,用于限制处理的文件数量 counter0# 遍历当前目录下的所有 .c 文件 for c_file in *.c…...

高速公路自动驾驶汽车超车控制方法研究
目录 摘要 ............................................................................................................ I Abstract ...................................................................................................... II 目录 ...............…...

Java 多线程系列Ⅰ(创建线程+查看线程+Thread方法+线程状态)
多线程基础 一、创建线程的五种方法前置知识1、方法一:使用继承Thread类,重写run方法2、方法二:实现Runnable接口,重写run方法3、方法三:继承Thread,使用匿名内部类4、方法四:实现Runnable&…...

无入侵接口文档smart-doc
Smart-doc优点: 1.非侵入式生成接口文档 2.减少接口文档的手动更新麻烦&保证了接口文档和代码的一致 3.随时可生成最新的接口文档 4.保持团队代码风格一致:smart-doc支持javadoc,必须按照这个才能生成有注释的接口文档 最终效果 1.导入依赖 <pl…...

nacos配置超级管理员账户,只能mysql存储数据(或者其他数据库)
nacos本身是不允许授权超级管理员账号的,也就是角色名“ROLE_ADMIN”。作者在页面上试过了,不必再次尝试改的方式是直接改数据库里面的数据...

【前端自动化部署】,Devops,CI/CD
DevOps 提到Jenkins,想到的第一个概念就是 CI/CD 在这之前应该再了解一个概念。 DevOps Development 和 Operations 的组合,是一种方法论,并不特指某种技术或者工具。DevOps 是一种重视 Dev 开发人员和 Ops 运维人员之间沟通、协作的流程。…...

【C语言】探讨蕴藏在表达式求解中的因素
🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:C语言 🔥该篇将探讨 操作符 和 类型转换 对表达式求解的影响。 目录: 隐式类型转换算术转换操作符的属性❤️ 结语 隐…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 是Linux系统下用于监视系统输入输出设备和CPU使…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...