消息队列- 背景知识

这里写目录标题

  • 前言
  • 消息队列
    • 消息队列的作用
    • 常见的消息队列
    • 消息队列的核心概念
    • 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与一些基本概念(队列等等)
最后将数据持久化, 怎么存储到硬盘中, 这个消息队列就实现好了

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

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

相关文章

Nginx下载和安装教程、Nginx目录结构、Nginx具体应用

1、Nginx概述 Nginx是一款轻量级的开源Web服务器软件,也是一种反向代理服务器。它以其高性能和灵活性而被广泛应用于互联网领域。本文将介绍Nginx的概述、下载和安装以及目录结构。 (1)Nginx介绍 Nginx最初由Igor Sysoev开发,目…

Pycharm工具Python开发自动添加注释(详细)

方法自动添加参数注释 定义了一个函数,在函数下面敲入了三个双引号后,enter回车并没有自动出现注释,如图: 解决办法 Pycharm中依次打开File —> Settings —> Tools —> Python Integrated Tools,如图&…

C++笔记之对指针类型的变量进行+1操作

C笔记之对指针类型的变量进行1操作 在C中,对指针类型的变量进行"1"操作会根据指针的数据类型而有所不同。这涉及到指针的算术运算,C中的指针算术运算是根据指针所指向的数据类型的大小来进行的。 code review! 文章目录 C笔记之对指针类型的…

最受欢迎的12个Python开源框架,还没用过你就OUT了!!!

今天给大家带来了12个在GitHub等开源网站中最受欢迎的Python开源框架。如果你正在学习python,那么这12个开源框架,千万别错过,这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试&#xff0…

zookeeper-3.7.1集群

1.下载&解压安装包apache-zookeeper-3.7.1-bin.tar.gz 解压到/app/ &改名zookeeper-3.7.1 [rootnode1 app]# tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz -C /app/ [rootnode1 app]# mv apache-zookeeper-3.7.1-bin zookeeper-3.7.1 ---- 删除docs [rootnode1…

五步快速搭建个性化外卖小程序商城

随着人们生活节奏的加快,外卖行业蓬勃发展。为了满足用户的需求,许多企业开始使用小程序商城来提供外卖服务。那么,如何制作一个功能完善、用户友好的外卖小程序商城呢?下面就来为大家详细介绍一下制作的步骤。 首先,我…

Docker consul容器服务更新与发现

Docker consul容器服务更新与发现 一、什么事服务注册与发现二、什么是consul三、consul部署1、consul服务器2、registrator服务器3、consul-template 一、什么事服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可…

Vue3+Vite+TypeScript常用项目模块详解

目录 1.Vue3ViteTypeScript 概述 1.1 vue3 1.1.1 Vue3 概述 1.1.2 vue3的现状与发展趋势 1.2 Vite 1.2.1 现实问题 1.2 搭建vite项目 1.3 TypeScript 1.3.1 TypeScript 定义 1.3.2 TypeScript 基本数据类型 1.3.3 TypeScript语法简单介绍 2. 项目配置简单概述 2.…

【CEEMDAN-WOA-LSTM】完备集合经验模态分解-鲸鱼优化-长短时记忆神经网络研究(Python代码实现)

目录 💥1 概述 1.1 完备集合经验模态分解原理 1.2 鲸鱼优化 1.3 LSTM 📚2 运行结果 🎉3 参考文献 🌈4 Python代码实现 💥1 概述 1.1 完备集合经验模态分解原理 早期的 EMD 方法具有较强的自适应性,能够有…

【弹力设计篇】聊聊限流设计

为什么需要限流 对于一个后端系统来说,其处理能力是有限的,会受到业务流程,系统配置等的限制,QPS和TPS有一个上限值,比如一个订单系统1分钟可以处理100个请求。当1分钟超过100个请求的时候,我们为了保证系…

5.python设计模式【单例模式】

内容:保证一个类只有一个实例,并提供一个访问它的全局访问点角色: 单例(Singleton) UML图 举个例子: 需求:一个类只能实例化一个对象,不能实例化多个对象 from abc import abstract…

QT【day2】

完善登录框&#xff1a; //main头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QDebug> //信息调试类&#xff0c;用于打印输出 #include<QIcon> //图标头文件 #include<QPushButton> //按钮类头文件 #include…

细说小程序底部标签---【浅入深出系列006】

浅入深出系列总目录在000集 如何0元学微信小程序–【浅入深出系列000】 文章目录 本系列校训学习资源的选择 学习语法的前提底部标签的总概鹅厂的自定义标签官方说明&#xff1a; 先来了解app.json文件tabBar 位于app.json哪里 使用流程要注意的是&#xff1a;配套资源作业&a…

fpga开发——蜂鸣器

蜂鸣器的原理 有源蜂鸣器和无源蜂鸣器 无源蜂鸣器利用电磁感应现象&#xff0c;为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜发声&#xff0c;接入直流电只能持续推动振膜而无法产生声音&#xff0c;只能在接通或断开时产生声音。无源蜂鸣器的工作原理与扬声…

git实战

git实战 第一章 快速入门 1.1 什么是git git是一个分布式的版本控制软件。 软件&#xff0c;类似于QQ、office、dota等安装到电脑上才能使用的工具。版本控制&#xff0c;类似于毕业论文、写文案、视频剪辑等&#xff0c;需要反复修改和保留原历史数据。分布式 - 文件夹拷贝…

linux网卡命名规则与修改方法

一.前言&#xff1a; 在早期的的操作系统中例如fedora13或者ubuntu15之前网卡命名的方式为eth0&#xff0c;eth1&#xff0c;eth2&#xff0c;属于biosdevname 命名规范。当然这是针对intel网卡的命名规则&#xff0c;对于realtek类型的网卡会命名为ens33。但是这个编号往往不一…

(七)「消息队列」之 RabbitMQ 发布者确认(使用 .NET 客户端)

发布者确认&#xff08;Publisher Confirms&#xff09; 发布者确认是一个 RabbitMQ 扩展&#xff0c;用于实现可靠的发布。当在通道上启用发布者确认时&#xff0c;客户端发布的消息将由代理异步确认&#xff0c;这意味着它们已在服务器端得到处理。 0、引言 先决条件 本教程…

uni-app个人中心

一. 介绍uni-app&#xff1a; uni-app 是基于Vue.js框架开发的一个跨平台移动应用开发框架&#xff0c;可以同时支持多个平台&#xff08;如iOS、Android、Web等&#xff09;的应用开发。采用了统一的语法和组件规范&#xff0c;可以大大简化跨平台开发的工作&#xff0c;提高…

SZ:zip/内部函数外部函数/VGG模型/nn

zip&#xff1a; -r recursion-d delete-m move (move隐藏的意思是&#xff0c;原文件会消失&#xff09;想增加文件&#xff0c;不需要加参数什么参数也没有。如果zip压缩文件不存在&#xff0c;执行以上命令将会创建一个新的zip文件并将指定的文件添加进去。如果zip压缩文件…

需求管理中最易忽视的6大重点

需求管理是产品经理的重点工作&#xff0c;如果无法有效进行需求管理&#xff0c;往往会引起需求变更、项目延期以及成本增加等问题。那么如何对需求进行高效管理&#xff0c;我们在需求管理中&#xff0c;往往最容易忽视的重点都有哪些&#xff1f; 1、重视项目整体管理计划 首…