消息队列- 背景知识

news2024/11/27 15:53:17

这里写目录标题

  • 前言
  • 消息队列
    • 消息队列的作用
    • 常见的消息队列
    • 消息队列的核心概念
    • BrokerServer核心概念
    • 消息队列的核心API
    • 消息队列与消费者之间的工作模式
    • 交换机的类型
    • 消息队列的持久化
  • 总结

前言

消息队列,不知道大家是否陌生,如果说消息队列感到陌生的话, 有一个模型肯定大家都听说过, 那就是生产者-消费者模型, 消息队列就是在生产者 - 消费者模型的基础上 填写成一个程序, 来让大家使用

消息队列

消息队列的作用

①: 解耦合
解耦合的意思是: 一般我们的通信双方A,B是直接相互联系的, 这样的话,如果一方出现问题, 那么另一方也会跟着等待, 而消息队列相当于是一座桥梁链接了通信AB双方, 一方出现问题另一方也不会立马罢工

②: 削峰填谷
削峰填谷的意思是: 我们都知道 不同的服务器的性能不一样, 假设通信双方 A的服务器性能好 ,B的性能差一点, 如果某个时间段, 突然请求大量增加, 那么服务器A顶的住 , 服务器B不一定顶的住, 所以如果是直接相连的话, 那么很容易从A发送过来的请求把B给干崩了, 而消息队列的存在, 使得A发送过来的请求, 要先进入到消息队列中, 服务器B可以按它的工作模式,从消息队列中取数据,进行应答然后返回给服务器A, 这样服务器不会因为A的请求量一下增大, 而造成服务器B的罢工

常见的消息队列

市面上常见的消息队列有哪些呢?
有RabbitMQ
有Kafka
有RocketMQ

我们的主要目的是如何模拟实现一个消息队列

在这里插入图片描述

消息队列的核心概念

  1. 生产者(producer): 产生数据的一方
  2. 消费者(consumer):获取数据的一方
  3. 中间人(broker): 存储数据的一方
  4. 发布(publish): 生产者向中间人投递数据的过程
  5. 订阅(subscribe): 消费者向中间人打招呼,要获取数据的这个过程
  6. 消费(consumer):消费者从中间人这里取数据的这个过程

BrokerServer核心概念

BrokerServer 是中间人,也是一台服务器,它的核心概念有哪些呢?

  1. 虚拟主机: BrokeServer可以有多态虚拟主机, 虚拟主机的作用类似于管理工厂不同的流水线, 里面存放这不同的逻辑数据集合(可以类比于数据库的database,一个数据库里面有多个database ,一个database中有不同的数据集合)
  2. 交换机: 交换机是生产者将消息投递的对象, 类似于公司的前台,将你引到合适的位置, 再将交换机将数据给对应的消息队列
  3. 队列: 队列是真正用来存储处理消息的实体, 后序的消费者也是从队列中获取数据
  4. 绑定:是将交换机与对应的队列建立起关联关系,(交换机与队列之间是多对多的关系, 一个队列可能对应多个交换机, 一个交换机也可能被多个队列对应))
  5. 消息: 消息指的是服务器A给服务器B发送的请求 或是 服务器B给服务器A返回的响应(消息中数据是自定义的, 可以是字符串, 也可以是二进制数据)

消息队列的核心API

  1. 创建队列 (queueDeclare)
    此处不使用Create的含义是: create 只是单纯的创建, 而Declared的效果是如果存在该队列就不创建, 不存在就创建
  2. 销毁队列(queueDelete)
  3. 创建交换机(exchangeDeclare)
  4. 销毁交换机(exchangeDelete)
  5. 创建绑定(queueBind)
  6. 销毁绑定(queueUnbind)
  7. 发布消息(basicPublish)
  8. 订阅消息(basicConsume)
  9. 确认消息(basicACK)
    确认消息指的是消费者给中间人发送一个消息处理完毕的显示请求

消息队列与消费者之间的工作模式

  1. 第一种Push(推): Broke 将收到的数据主动发送给,订阅的消费者
  2. 第二种Poll(垃) : 消费者主动调动Broke的API来取数据

交换机的类型

在消息队列中,有着不同的交换机的类型, 用来指定不同的传递规则, 交换机在传递消息的时候, 是根据规则来确定给那个队列传递的

  1. Direct - 直接交换机: 指定目标队列的名字, 直接交换

可以将直接交换机理解为专属红包, 只有指定的人才能领

  1. Fanout - 扇出交换机: 将消息发送到每个此交换机绑定的队列中

理解为全体红包, 所有人都能领, 领的钱还一致

  1. Topic - 主题交换机 : 交换机与队列之间有个暗号(bindKey), 发送方通过暗号(routingKey)将消息传送到指定的队列中

理解为画图红包, 只有完成指定的动作才能领

  1. Header- 消息头交换机

消息队列的持久化

消息队列当然要持久化的,不然你重启下电脑,数据都丢失了怎么行
所以消息队列的存储方式,是内存一份,硬盘一份, 存储内存是为了快, 存储硬盘是为了数据不丢失

总结

一个消息队列的实现 : 需要实现生产者 - 消费者模型,生产者- 消费者对应的是客户端与服务器, 要给客户端提供一组API , 让其通过网络通信的方式远程调用Borker Server 提供的方法
实现Borker Server 要实现核心API与一些基本概念(队列等等)
最后将数据持久化, 怎么存储到硬盘中, 这个消息队列就实现好了

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

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

相关文章

【驱动开发day4作业】

头文件代码 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; #define PHY_LED1_ADDR 0X50006000 #define PHY_LED2_ADDR 0X50007000 #…

springboot 自定义注解 ,实现接口限流(计数器限流)【强行喂饭版】

思路:通过AOP拦截注解标记的方法,在Redis中维护一个计数器来记录接口访问的频率, 并根据限流策略来判断是否允许继续处理请求。 另一篇:springboot 自定义注解 ,aop切面Around; 为接口实现日志插入【强行喂…

LeetCode第 N 个泰波那契数 (认识动态规划)

认识动态规划 编写代码代码空间优化 链接: 第 N 个泰波那契数 编写代码 class Solution { public:int tribonacci(int n) {if(n 0){return 0;}else{if(n 1 || n 2)return 1;}vector<int> dp(n 1);dp[0] 0;dp[1] 1;dp[2] 1;for(int i 3;i < n;i){dp[i] dp[i-3]…

多巴胺色彩青春来袭!体验全能轻薄本华硕无畏Pro15 2023

这个烈日炎炎的夏季&#xff0c;还是来临了&#xff01; 40℃的高温&#xff0c;恍然才知道这个地球真的是在“发光发热”&#xff0c;对于莘莘学子来说&#xff0c;青春的炙热与憧憬也在即将告别的毕业季中变得热烈。回首停留在校园中的一幕幕&#xff0c;总有一些记忆&#…

javascript 7种继承-- new操作符的原理以及实现

new 运算符 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。 MDN参考资料&#xff1a;点击 语法 new constructor[([arguments])]参数 constructor 一个指定对象实例的类型的类或函数。 arguments 一个用于被 constructor 调用的参数列表。 …

JAVA基础-基于多线程的聊天程序

引言 什么是程序 &#xff1f; 一个程序可以有多个进程 。程序是一段静态的代码&#xff0c;它是应用程序执行的蓝本。 什么是进程 &#xff1f; 一个进程可以有多线程 进程是指一种正在运行的程序&#xff0c;有自己的地址空间。 作为蓝本的程序可以被多次加载到系统的不同内…

Visual Studio Code配置免密远程开发环境

VSCode安装插件 要是想连接远程服务器&#xff0c;先在本地安装下面的插件&#xff08;红色圈起来的需要装&#xff09; 连接远程服务器 配置服务器信息 保存然后再连接&#xff0c;输入密码&#xff0c;如果能连接上说明是没问题的&#xff0c;下面开始免密登录 免密配置 客…

【多线程带来的的风险-线程安全的问题的简单实例-线程不安全的原因】

文章目录 前言线程不安全的5大原因1. 抢占式执行和随机调度2. 多个线程同时修改一个变量(共享数据&#xff09;3. 修改操作不是原子性的4. 内存可见性5. 指令重排序 前言 什么是线程安全&#xff1f; 简单来说&#xff0c;如果多线程环境下代码运行的结果是符合我们预期的&am…

7月《中国数据库行业分析报告》已发布,聚焦图数据库、首发【全球图数据库产业图谱】

为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况&#xff0c;从2022年4月起&#xff0c;墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》&#xff0c;持续传播数据技术知识、努力促进技术创新与行业生…

Yunfly 一款高效、性能优异的node.js企业级web框架

介绍 Yunfly 一款高性能 Node.js WEB 框架, 使用 Typescript 构建我们的应用。 使用 Koa2 做为 HTTP 底层框架, 使用 routing-controllers 、 typedi 来高效构建我们的 Node 应用。 Yunfly 在 Koa 框架之上提升了一个抽象级别, 但仍然支持 Koa 中间件。在此基础之上, 提供了一…

不同薪资阶段的Android 对“binder 的理解”

转载地址&#xff1a;https://zhuanlan.zhihu.com/p/420660511 面试官提了一个问题&#xff0c;我们来看看三位应聘者的表现如何吧 自认为无所不知&#xff0c;水平已达应用开发天花板&#xff0c;目前月薪 10k 面试官️&#xff1a;谈谈你对 binder 的理解 A&#xff1a;bind…

5-linux中的定时任务调度

定时任务调度 crond 任务调度概述基本语法常用选项快速入门应用实例crond 相关指令 at 定时任务基本介绍at 命令格式at 命令选项at 时间的定义其他指令 crond 任务调度 crontab 进行 定时任务调度 概述 任务调度&#xff1a;是指系统在某个时间执行的特定的命令或程序 任务…

CISP-PTE和CISP-PTS哪个更适合?

CISP-PTE和CISP-PTS是两个与网络安全渗透测试相关的认证&#xff0c;虽然它们有相似之处&#xff0c;但也存在一些区别。 CISP-PTE&#xff1a;证书持有人员主要从事信息安全技术领域网站渗透测试工作&#xff0c;具有规划测试方案、编写项目测试计划、编写测试用例、测试报告…

【C++ 异步任务 】`std::future`

1.基础知识 std::future 是 C 标准库中的一个类模板&#xff0c;定义在 <future> 头文件中。它提供了一种异步操作的机制&#xff0c;用于获取异步任务的结果。 std::future 类模板表示一个未来可能会获得的值。你可以将一个异步任务交给 std::future 来管理&#xff0…

苍穹外卖-day08 java实现 微信支付

苍穹外卖-day08 课程内容 导入地址簿功能代码用户下单订单支付 功能实现&#xff1a;用户下单、订单支付 用户下单效果图&#xff1a; 订单支付效果图&#xff1a; 1. 导入地址簿功能代码 1.1 需求分析和设计 1.1.1 产品原型 地址簿&#xff0c;指的是消费者用户的地址信息&…

Django学习笔记-视图(views)的使用

Django中可以使用views进行管理&#xff0c;类似于WPF的MVVM的ViewModel层&#xff0c;也相当于MVC架构的模Controller层。 一、基于函数的视图FBV&#xff08;Function-Based View&#xff09; 通过定义一个函数&#xff0c;包含HttpRequest对象作为参数&#xff0c;用来接受…

运维高级--shell脚本完成分库分表

为什么要进行分库分表 随着系统的运行&#xff0c;存储的数据量会越来越大&#xff0c;系统的访问的压力也会随之增大&#xff0c;如果一个库中的表数据超过了一定的数量&#xff0c;比如说MySQL中的表数据达到千万级别&#xff0c;就需要考虑进行分库分表&#xff1b; 其…

分享几个电脑录制GIF图片的小工具(附下载链接)

GIF工具 1.GIF1232.ScreentoGif3.gifcam4.LICECAP5.recordit 1.GIF123 点击下载: GIF123 介绍 GIF123&#xff1a;是单文件的绿色软件&#xff0c;无任何外部依赖项&#xff0c;体积仅755KB&#xff0c;支持windows所有版本操作简单&#xff01;&#xff01; 2.ScreentoGif …

梯度提升树的参数

目录 1. 迭代过程 1.1 初始预测结果的设置 1.2 使用回归器完成分类任务 ① 二分类情况 ② 多分类情况 1.3 GBDT的8种损失函数 ① 分类器中的loss a. 二分类交叉熵损失 b. 多分类交叉熵损失 c. 二分类指数损失 d. 多分类指数损失 ② 回归树中的loss a. 平方误差 b…

JPA连接达梦数据库导致auto-ddl失效问题解决

现象&#xff1a; 项目使用了JPA&#xff0c;并且auto-ddl设置的为update&#xff0c;在连接达梦数据库的时候&#xff0c;第一次启动没有问题&#xff0c;但是后面重启就会报错&#xff0c;发现错误为重复建表&#xff0c;也就是说已经建好的表没有检测到&#xff0c;…