模拟实现消息队列项目(系列2) -- 项目前期的准备

目录

前言

1. 需求分析

1.1 核心概念

1.2 核心API

1.3 交换机类型 

1.4 持久化

1.5 网络通信

1.6 消息应答

 2. 模块划分

结语


前言

        我们在上一个系列对于消息队列有了初步的认识,那我们明白了消息队列的用途之后,我们就开始进行我们的项目了,首先我们的项目是仿照RabbitMQ进行实现的,但是有些功能我们没有实现,毕竟RabbitMQ是一个经典的消息队列,要想自己完全实现,还是有一定程度的难度的.但是我们项目实现的这些功能肯定能帮助我们深刻理解消息队列这个组件的.当我们完成这个项目的时候,回过头来再看别的消息队列,也会有很大的帮助.

        本章是对我们的项目做一些前期的准备.主要涵盖需求分析模块划分两个部分.本项目的配置环境为:SpringBoot2系列以及Java8版本,相关依赖框架会涉及到MyBatis和sqlite数据库.


1. 需求分析

1.1 核心概念

有关消息队列的核心概念,在上节已经简单的总结过了,我们这里再简单的回顾一下.

1. 生产者(Producer) 

2. 消费者(Consumer)

3. 中间人(Broker)

4. 发布(Publish)

5. 订阅(Subscribe)

一个生产者一个消费者

 多个生产者多个消费者

Broker内部结构,依次为: 消息队列 虚拟主机 交换机 队列 绑定  

以上的所有概念,即需要在内存中存储,也需要在硬盘中存储

1. 内存存储: 执行效率快,方便我们使用

2. 硬盘存储: 重启消息队列服务器,数据不会发生丢失,可以恢复到内存中.

1.2 核心API

对于Broker来说,我们要通过这些API来实现消息队列的基本功能.

         此外我们这个消息队列支持跨主机进行使用的,那么生产者和消费者是通过网络的方式调用消息队列的这些API的.其中我们对于虚拟主机的设计只设置了一个虚拟主机在消息队列中,而RabbitMQ是支持多个虚拟主机的,同时支持虚拟主机的创建和删除.

1.3 交换机类型 

        对于交换机我们此项目实现了三种类型的交换机,而原来的RabbitMQ是支持四种交换机类型的:

1. Direct(直接交换机)

2. Fanout(扇形交换机)

3. Topic(主题交换机)

4. Header(头交换机)(未实现:比较复杂,并且用的比较少见)

 主题交换机会将message1添加到Queue2中,将message2添加到Queue2中.

1.4 持久化

Exchange,Queue,Binding,Message都有持久化的属性.我们设计的的时候给出持久化属性.

当程序重启后/主机重启,保证数据的不丢失.

1.5 网络通信

        生产者和消费者都是客户端的程序,Broker是服务器,我们的程序支持跨主机使用,使用网络进行通信,在网络通信的过程中没客户端要实现API进行远程操作服务器.

 我们在Broker的基础上,客户端要增加网络连接Connection和Channel操作

 下面网线就能很形象的表示Connection和Channel之间的关系.

1.6 消息应答

为了保证消息是否被消费者消费,消费者需要进行应答.

 2. 模块划分

 以上是整个消息队列项目所有的模块,其中有关数据的存储,我们会将交换机 队列 绑定 存储在数据库,消息存储在本地文件中.其中对以上信息也存储在内存,在内存中存储的是这些对象的引用,保证我们更快的操作数据.


结语

        本节为我们的项目开了个头,做了很多的铺垫工作,我们要明白这些工作是很有必要的,在以后的工作中,我们一定要把整个项目的实现思路捋清楚了,再开始写代码,这样我们的工作会事半功倍的.我们接下来就会进入到代码的部分,请大家多多关注后续系列,谢谢!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Spring Boot】(三)深入理解 Spring Boot 日志

文章目录 前言一、日志文件的作用二、Spring Boot 中的日志2.1 查看输出的日志信息2.2 日志格式二、Spring Boot 中的日志2.1 查看输出的日志信息2.2 日志格式 三、自定义日志输出3.1 日志框架3.2 日志对象的获取3.3 使用日志对象打印日志 四、日志级别4.1 日志级别的作用4.2 日…

springboot配置文件的使用

目录 1.application.properties是springboot默认的配置文件,但是比较繁琐,一般用.yml文件 2. 配置文件的作用 3.配置文件的使用 1.application.properties是springboot默认的配置文件,但是比较繁琐,一般用.yml文件 ①、properti…

我在leetcode用动态规划炒股

事情是这样的,突然兴起的我在letcode刷题 121. 买卖股票的最佳时机122. 买卖股票的最佳时机 II123. 买卖股票的最佳时机 III 以上三题。 1. 121. 买卖股票的最佳时机 1.1. 暴力遍历,两次遍历 1.1.1. 算法代码 public class Solution {public int Ma…

webpack基础知识八:说说如何借助webpack来优化前端性能?

一、背景 随着前端的项目逐渐扩大,必然会带来的一个问题就是性能 尤其在大型复杂的项目中,前端业务可能因为一个小小的数据依赖,导致整个页面卡顿甚至奔溃 一般项目在完成后,会通过webpack进行打包,利用webpack对前…

使用事件侦听器和 MATLAB GUI 查看 Simulink 信号研究

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Linux(三):Linux服务器下日常实操命令 (常年更新)

基础命令 cd命令:切换目录 cd :切换当前目录百至其它目录,比如进入/etc目录,则执行 cd /etccd / :在Linux 系统中斜杠“/”表示的是根目录。cd / ,即进入根目录.cd ~:进入用户在该系统的home目录&#…

Linux——设备树

目录 一、Linux 设备树的由来 二、Linux设备树的目的 1.平台识别 2.实时配置 3.设备植入 三、Linux 设备树的使用 1.基本数据格式 2.设备树实例解析 四、使用设备树的LED 驱动 五、习题 一、Linux 设备树的由来 在 Linux 内核源码的ARM 体系结构引入设备树之前&#x…

【CSS】圆形放大的hover效果

效果 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"avatar"></…

机器学习常用Python库安装

机器学习常用Python库安装 作者日期版本说明Dog Tao2022.06.16V1.0开始建立文档 文章目录 机器学习常用Python库安装Anaconda简介使用镜像源配置 Pip简介镜像源配置 CUDAPytorch安装旧版本 TensorFlowGPU支持说明 DGL简介安装DGLLife RDKitscikit-multilearn Anaconda 简介 …

英语使用场景口语

HOTEL ENGLISH hotel motel inn b&b Process 1.booking a room can i reserve a room? reservation do you have and singles? double room standard room deluxe room presidential suite do you have a pick-up service? 2.checking in where is the recept…

MySQL的数据插入总结(不存在就插入,存在就更新)

MySQL的数据插入总结(不存在就插入&#xff0c;存在就更新) 1. on duplicate key update 当在insert语句后面带上ON DUPLICATE KEY UPDATE 子句&#xff0c;而要插入的行与表中现有记录的惟一索引或主键中产生重复值&#xff0c;那么就会发生旧行的更新&#xff1b;如果插入的…

AI 绘画Stable Diffusion 研究(五)sd文生图功能详解(下)

大家好&#xff0c;我是风雨无阻。 上一篇文章详细介绍了sd文生图的功能及使用注意事项&#xff0c;感兴趣的朋友可以前往查看&#xff1a;AI 绘画Stable Diffusion 研究&#xff08;四&#xff09;sd文生图功能详解&#xff08;上&#xff09; 。 那今天这篇文章&#xff0c;我…

sigmoid ReLU 等激活函数总结

sigmoid ReLU sigoid和ReLU对比 1.sigmoid有梯度消失问题&#xff1a;当sigmoid的输出非常接近0或者1时&#xff0c;区域的梯度几乎为0&#xff0c;而ReLU在正区间的梯度总为1。如果Sigmoid没有正确初始化&#xff0c;它可能在正区间得到几乎为0的梯度。使模型无法有效训练。 …

【Github】Uptime Kuma:自托管监控工具的完美选择

简介&#xff1a; Uptime Kuma 是一款强大的自托管监控工具&#xff0c;通过简单的部署和配置&#xff0c;可以帮助你监控服务器、VPS 和其他网络服务的在线状态。相比于其他类似工具&#xff0c;Uptime Kuma 提供更多的灵活性和自由度。本文将介绍 Uptime Kuma 的功能、如何使…

C#--设计模式之单例模式

单例模式大概是所有设计模式中最简单的一种&#xff0c;如果在面试时被问及熟悉哪些设计模式&#xff0c;你可能第一个答的就是单例模式。 单例模式的实现分为两种&#xff1a; 饿汉式&#xff1a;在静态构造函数执行时就立即实例化。懒汉式&#xff1a;在程序执行过程中第一…

C++类的定义和对象的创建

一、问题引入 C类和对象到底是什么意思&#xff1f; 1、C 中的类&#xff08;Class&#xff09;可以看做C语言中结构体&#xff08;Struct&#xff09;的升级版。结构体是一种构造类型&#xff0c;可以包含若干成员变量&#xff0c;每个成员变量的类型可以不同&#xff1b; …

K8s的高可用搭建

高可用技术搭建 在master节点上需要部署&#xff1a;keepalived、haproxy

Linux 信号signal处理机制

Signal机制在Linux中是一个非常常用的进程间通信机制&#xff0c;很多人在使用的时候不会考虑该机制是具体如何实现的。signal机制可以被理解成进程的软中断&#xff0c;因此&#xff0c;在实时性方面还是相对比较高的。Linux中signal机制的模型可以采用下图进行描述。 每个进程…

openGauss学习笔记-33 openGauss 高级数据管理-视图

文章目录 openGauss学习笔记-33 openGauss 高级数据管理-视图33.1 语法格式33.2 参数说明33.3 示例 openGauss学习笔记-33 openGauss 高级数据管理-视图 视图与基本表不同&#xff0c;是一个虚拟的表。数据库中仅存放视图的定义&#xff0c;而不存放视图对应的数据&#xff0c…

Misc取证学习

文章目录 Misc取证学习磁盘取证工具veracryto挂载fat文件DiskGenius 磁盘取证例题[RCTF2019]disk 磁盘[](https://ciphersaw.me/ctf-wiki/misc/disk-memory/introduction/#_2)内存取证工具volatility 内存取证例题数字取证赛题0x01.从内存中获取到用户admin的密码并且破解密码 …