项目实战 — 消息队列(1) {需求分析}

news2024/11/6 7:32:04

一、什么是消息队列

消息队列(Message Queue ,MQ),就是将阻塞队列的数据结构,提取成了一个程序,独立进行部署。也就是实现一个生产者消费模型。

有关生产者消费者模型,参考多线程 — 阻塞队列_多线程阻塞队列_‍️藿香正气水的博客-CSDN博客这里就不多说。

阻塞队列的生产者消费者模型,实在一个进程内部进行的,而消息队列的生产者消费者模型是进程和进程之间,服务和服务之间进行的。它是一个分布式系统,是由一组服务器构成的“集群”。

一些知名的MQ:* RabbitMQ,* Kafka,* RocketMQ,ActiveMQ

这里实现的消息队列是基于RabbitMQ进行编写的。

二、需求分析


🍅1、核心概念

        核心概念

                1.生产者(Producer)

                2.消费者(Consumer)

                3.中间人(Brocker)

                4.发布(Publish)   生产者向中间人投递消息的过程

                5.订阅(Subscribe)哪些消费者从中间人取数据,称为“订阅”

                6.消费 (Consume)消费者从中间人手里取出数据

一对一:消费者和生产者 

多对多:消费者和生产者 

 

 关于BrockerServer涉及到的相关概念:

        1. 虚拟机(Virtual Host),类似于MySQL中的database,是一个“逻辑上”的数据集合

        2. 交换机(Exchange),生产者把消息投递给BrokerServer,实际上是先把消息交给了Brocker Server上的某个交换机,再由交换机把消息转发给对应的队列

        3. 队列(Queue), 真正用来存储处理消息的实体,后续消费者也是从队列中取出数据。一个消息队列中,可以由很多具体的小队列。

        4. 绑定(Binding),将交换机和队列联系起来,主要是“多对多”这样的关系。一个交换机可以对应到多个队列,一个队列也可以被多个交换机对应。

        5. 消息(Message),也就是服务器A发给B的请求,然后通过MQ转发。服务器B给A的响应,通过MQ来转发也是一个消息。


 🍅2、核心API

        * 创建队列(queueDelare)

        * 销毁队列(queueDelete)

        * 创建交换机(exchangeDeclare)

        * 创建绑定(queueBind)

        * 解除绑定(queueUnbind)

        * 发布消息(basicPublish)

        * 订阅消息(basicConsume)

        * 确认消息(basicAck)保证了消息的处理没有遗漏


🍅3、交换机类型

交换机再转发消息的时候,是有一套转发规则的,以下是几种不同的交换机类型,描述了不同的转发规则:主要有四种

* Direct 直接交换机

* Fanout 扇出交换机

* Topic 主题交换机

* Header消息交换机

项目中主要使用了前三种。

🎊Direct 直接交换机

生产者发送消息的时候,会指定一个“目标队列的名字”,交换机收到之后,然后查看绑定的队列中是否含有匹配的队列,如果有,就直接转发过去;如果没有,就直接丢弃。

 🎊Fanout 扇出交换机

给每个队列都转发:

🎊Topic主题交换机

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

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

当bindingKey和routingKey之间能够对上暗号(单词),就可以将这个个消息发给对应的队列了。


🍅 4、持久化

将数据在内存和硬盘中各自都存储一份。

以内存为主,硬盘为辅。

在内存中存储的原因:

        在内存中组织数据,效率回避在硬盘上要高很多。对于MQ来说,高效的转发和处理数据是很关键的指标。

在硬盘上存储的原因:

        为了防止内存中的数据随着进程的重启或者主机的重启二而丢失。


🍅5、网络通信 

使用 TCP + 自定义的应用层协议 实现生产者 / 消费者 / BrockerServer之间的交互工作。

自定义的协议主要工作是让客户端通过网络,调用brocker server提供的编程接口。


🍅6、应答模式

        自动应答: 消费者取走了消息,就算应答了

        手动应答:basicAcK方法属于手动应答(消费者主动调用该api进行应答)

 三、总结

具体工作:

        1.需要实现生产者,broker server,消费者三个部分

        2.针对生产者消费者,主要编写客户端和服务器的网络通信部分

        给客户端提供一组api,让客户端的业务代码来调用,从而通过网络通信的方式远程调用broker server上面的方法

        3.实现Broker Server以及broker server内部的一些基本概念和核心的api。

        4.持久化,数据的存储

这里的MQ不支持分布式部署,只是一个单机的,能够给多个生产者消费者提供服务。 

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

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

相关文章

redis基本架构:一个键值数据库包含什么?(这篇文章主要是一个引导的作用)

我们设计一个简单的smpliekv数据库,来体验简直数据库包含什么 体来说,一个键值数据库包括了访问框架、索引模块、操作模块和存储模块四部分(见 下图)。接下来,我们就从这四个部分入手,继续构建我们的 Simpl…

【MyBatis】MyBatis 3.5+版本报错合集(持续更新)

报错:BindingException 1. org.apache.ibatis.binding.BindingException: Type interface xxx is not known to the MapperRegistry. 2. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): xxx 解决方案 在pom.xml中添加如下代码…

NetApp FAS控制器的启动过程详解

了解NetApp FAS存储系统的控制器启动过程对于控制器故障的诊断分析非常重要,最近在给几个小朋友培训NetApp,顺便把这个启动过程总结了一下,分享给大家,遇到控制器故障,就可以照方抓药了,如果还是搞不懂&…

自学网络安全(黑客)的注意事项

自学网络安全是一项重要而复杂的任务,以下是一些注意事项: 确定学习目标:网络安全是一个广泛的领域,包括密码学、网络防御、漏洞利用等多个方面。在自学之前,确定你感兴趣的领域,并设定明确的学习目标。 寻…

自动化测试如何管理测试数据

前段时间,知识星球里有同学问到:自动化case越多,测试数据越多,数据的管理成本也越来越高,是否需要一个数据池来专门管理测试数据?这是一个好问题,也是很多测试同学在自动化测试实践中必须面对的…

RWEQ模型土壤风蚀模拟与风蚀模数估算、数据支持、参量提取、归因分析、相关SCI论文撰写技巧

目录 专题一 理论基础 专题二 平台基础 专题三 RWEQ模型数据支持 专题四 RWEQ模型参量提取 专题五 归因分析 专题六 RWEQ模型相关的SCI论文撰写技巧 结合案例讲解RWEQ模型的运行及相关的归因分析,从原理、数据、方法、归因分析方面对土壤风蚀情况进行实战讲解…

绝不多花一分钱,IT老兵的云上省钱之旅

相信很多网友感觉今年的日子不好过,各方面都在缩减支出,尤其是部分IT设备还在不断涨价,像今年的英伟达的40系桌面级显卡和A/H系列的商用显卡,动辙价格跳涨30%,让广大开发者苦不堪言。所幸在省钱方面,笔者有…

【c++底层结构】AVL树红黑树

【c底层结构】AVL树&红黑树 1.AVL树1.1 AVL树的概念1.2 AVL树结点的定义1.3 AVL树的插入1.4 AVL树的旋转1.5 AVL树的验证1.6 AVL树的性能 2. 红黑树2.1 红黑树的概念2.2 红黑树的性质2.3 红黑树节点的定义2.4 红黑树的插入操作2.5 红黑树的验证2.6 红黑树与AVL树的比较2.7 …

linux之iptables的理解与使用

1. 前言 iptables是一个用于Linux操作系统的防火墙软件,它可以对网络流量进行过滤、修改和重定向,从而控制网络通信。iptables是Linux内核中的一个子系统,它可以通过在命令行输入规则来配置网络防火墙。iptables可以对入站和出站的流量进行控…

初识mysql数据库之事务的隔离性

目录 一、理解隔离性 二、隔离级别 1. 不同的隔离级别的简单概述 2. 查看隔离级别 2.1 查看全局隔离级别 2.2 查看会话隔离级别 3. 设置隔离界别 4. 读未提交(Read Uncommitted) 4.1 读未提交测试 5. 读提交(Read Committed&#x…

Windows 10 安装 PostgreSQL 12.x 报错 ‘psql‘ 不是内部或外部命令 由于找不到文件libintl-9.dll等问题

目录 序言一、问题总结问题 1 psql 不是内部或外部命令,也不是可运行的程序或批处理文件。问题 2 “由于找不到文件libintl-9.dll,无法继续执行代码,重新安装程序可能会解决此问题。“1、卸载2、安装3、安装 Stack Builder (这个可…

Easyexcel简介及写、读操作

Easyexcel简介及写、读操作 一、背景二、简介三、引入依赖四、代码实现1.创建实体类2.写入excel操作3.读取文件操作3.1 指定excel对应索引3.2 设置监听器3.3 执行读取操作 一、背景 作为一个经常进行数据分析的后端人员,免不了面对各种报表,且在日常的工…

onTouchEvent浅析

我们接着上次的自定义星星来作讲解 当 onTouchEvent 返回 super.onTouchEvent ( false ) 时 public boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d("ACTION_DOWN","ACTION_DOWN:"event.getA…

Ansible-playbook(剧本)

Ansible-playbook(剧本) 一、playbook的构成 (1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行(2)Variables:变量(3)Templates&am…

mybatis复杂环境搭建-多对一的处理-一对多的处理

复杂环境搭建: 1.1建表: CREATE table teacher( id int(10) not null, name varchar(30) default null, primary key(id) )engineInnoDB default charsetutf8mb3;INSERT INTO teacher (id, name) VALUES (1, 何老师);create table student( id int(10)…

用户端App自动化测试

一、自动化用例录制 1、Appium Inspctor 功能介绍 UI 分析录制用例元素查找测试Attcah 已有的 session云测试 2、用例录制 1)获取 app 的信息 2)配置待测应用 3、获取 app 的信息 1)app 入口,两种方式获取: * 通…

Linux系统中MySQL主从复制

本节主要学习了MySQL Replication概述,优点,复制类型,复制方式,复制过程和复制过程的限制,部署MySQL主从异步复制的流程及问题解决。 目录 一、MySQL Replication概述 1、优点 二、MySQL复制类型 1.异步复制&#…

#vue3报错 Cannot read properties of null (reading ‘isCE‘)#

场景:使用 npm 安装依赖包的时候,如如安装 npm i xlsx npm i file-saver 重新运行报错 Cannot read properties of null (reading isCE)# 解决办法: 使用的vite vue 在vite.config.ts添加如下配置: dedupe: [ vue ]

LeetCode使用最小花费爬楼梯(动态规划)

使用最小花费爬楼梯(动态规划) 题目描述算法流程(方法一)编程代码优化代码算法流程(方法二)编程代码代码优化 链接: 使用最小花费爬楼梯 题目描述 算法流程(方法一) 编程代码 class Solution { public:int minCostClimbingStair…

【雕爷学编程】Arduino动手做(104)---16X16点阵汉字屏模块2

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…