消息队列思想学习(以及池化思想延展)

目录

消息队列的功能

消息中间件必备

池化思想以及弹性线程池的设计

弹性连接池 [核心参数:初始连接数,最大连接数,最大空闲时间]

弹性线程池 [核心参数:coreThreadCount, maxThreadCount]


引言:为啥要把消息队列,池化技术放在一块进行思考,我觉着它们都利用队列容器来解耦合。都有着类似的思想在其中。也都有着生产者消费者的设计思想和理念在里面。

消息队列的功能

基本作用:用于数据交换。中间层容器。

  • 大流量消峰
  • 异步解耦

经常听到上述说法。但是这些晦涩专业名词背后的隐含功能是什么?

大流量消峰,那就是过度一下,避其锋芒。先囤起来,然后将其均衡负载给消费者组件,保证系统的可用性,不因为大流量而崩溃无法服务。具体一点,你的服务器,RedisMySQL各自的承受能力都不一样,直接全部流量照单全收可能会造成服务崩溃。所以缓一缓,排个队。

异步:提高响应速度,快速响应客户。将客户请求封装成消息放入消息队列即可。不用同步等待消息处理即可返回给客户。(非关键路径上的操作可异步)

解耦:利用MQ做中间层,就很像设计模式中的抽象层。可以将生产者组件和消费者组件给分隔开来,不用耦合在一起,使得系统变得简单。分隔开的组件可以单独扩展,而不会造成牵一发而动全身。

其他功能:队列本身的顺序性,来满足消息必须按顺序投递的场景;利用队列 + 定时任务来实现消息的延时消费;

所谓的“削峰填谷”就是指缓冲上下游瞬时突发流量,使其更平滑。特别是对于那种发送能力很强的上游系统,如果没有消息引擎的保护,“脆弱”的下游系统可能会直接被压垮导致全链路服务“雪崩”。但是,一旦有了消息引擎,它能够有效地对抗上游的流量冲击,真正做到将上游的“峰”填满到“谷”中,避免了流量的震荡。消息引擎系统的另一大好处在于发送方和接收方的松耦合,这也在一定程度上简化了应用的开发,减少了系统间不必要的交互。

消息中间件必备

说白了,消息中间件,或者说消息引擎系统。它相较于简单的消息队列,它功能更多,包括持久化避免消息丢失呀,高可用呀,高可靠呀,可扩展等更多那种分布式系统下的系统特征。

作为消息队列中间件,需要具备以下能力:(为啥会有下面种种的需求?可以思考下的,简单的想一想用了消息中间件之后,生产者消费者都依赖它。它如果挂掉了,肯定是灾难性的。它的下游服务全都没了。所以它必须高可靠、高可用呀。)

  1. 1. 消息持久化:确保在系统故障时消息不会丢失。

  2. 2. 高可用性和容错性:通过集群和故障转移机制确保系统的稳定运行。

  3. 3. 消息确认和可靠传递:保证消息被正确接收和处理。

  4. 4. 负载均衡:在多个生产者和消费者间有效分配消息。

  5. 5. 扩展性:支持根据负载增加节点以扩展系统。

所以最好kafka这些不要叫做消息队列,而要叫做 Apache Kafka 是一款开源的消息引擎系统。根据维基百科的定义,消息引擎系统是一组规范。企业利用这组规范在不同系统之间传递语义准确的消息,实现松耦合的异步式数据传递

消息引擎系统还要设定具体的传输协议,即我用什么方法把消息传输出去,有点对点和发布订阅两种模式

  1. 1. 点对点模式:多个生产者向同一个队列发送消息,每个消息只能由一个消费者消费。

  2. 2. 发布订阅模式:多个发布者向相同的主题发送消息,而订阅者也可能存在多个。每个消息都能被多个订阅者获取和处理。一份消息数据是否可以被多次消费?

池化思想以及弹性线程池的设计

池化思想实现:其本质我觉得就是生产者和消费者模式。简化版本的消息中间件。不能用于分布式,没有高可靠、高可用。

生活例子:健身房中有限的跑步机数目,假如说总共也就10台机子。老板平时开个4台用,节约能源。然后呢?客户少的时候,可以直接用现成打开了的机器。人开始多起来了,新来的客户就需要打开新的机器使用。总有个极限,今天生意过于火爆,人太多了,并且都想用跑步机,十台机器全开了。后续的客户咋办呢?只能给人说,客户要不您等待个一定时间,先玩玩别的。时间到了还没有空闲机器,客户心情不悦,我们也只得给客户说声抱歉。

弹性连接池 [核心参数:初始连接数,最大连接数,最大空闲时间]

流程:

  1. 最开始在初始化的时候就创建好固定数目的初始化连接数。并且设置好初始化连接数,最大连接数,最长空闲时间这三参数。选择用队列容器存储创建的连接。
  2. 如果 cnt_size < init_size,说明有空闲连接,直接拿来复用。
  3. 否则 cnt_size >= init_size && cnt_size < max_size,说明没有空闲连接,但是也没超出资源范围,申请创建新的连接,拿来用。
  4. 若是 cnt_size >= max_size,等一个check_out_time的超时时间(也就是最大空闲时间嘛),如果期间结束还没有空出的连接给等待了超时时间的客户使用,只能抛出错误。说明下资源紧张啥的。
  5. 另外:不在上述范围顺序,还需要存在一个检测的线程,异步定时检测,如果当前维护的连接数 > init_size && 多余的连接空闲时间超出了 最大空闲时间。这块资源无端占用就可以释放出来,节约系统资源。

这个池化技术的思想大家都懂,就是避免大量的临时创建销毁的时间占用过大,以及充分利用申请的系统资源。

弹性线程池 [核心参数:coreThreadCount, maxThreadCount]

JDK线程池处理流程:

  1.  threadCount < coreThreadCount 时候,如果有空闲线程,直接拿来用,否则创建新的线程拿来用。
  2. threadCount >= coreThreadCount && threadCount < maxThreadCount 时候,将企图将任务放入任务队列,等待空闲线程处理
  3. 如果任务队列满了。才继续创建新的线程来处理任务。
  4. threadCount > maxThreadCount,并且任务队列满了的话,只能返回错误,任务队列没满则放入任务队列等待处理。

CPU密集型 VS IO密集型的选择

上述的JDK线程池的实现就适合CPU密集型。为什么这么说,它尽量的在避免创建过多的线程导致大量的线程间切换的代价。线程达到核心线程数之后,任务来了先尝试往任务队列中放,而不是直接创建新的线程处理。

线程数过多的代价是什么?跨CPU处理器和跨CPU处理器内部的核心。大量缓存失效,大量上下文切换,多处理器通信的代价。                         

CPU密集型和IO密集型的线程数设计(单CPU处理器架构下)

 业内一般支持,CPU密集型下,将线程数设计在CPU核心数左右。

IO密集型,将线程数设计在CPU核心数的2倍左右。    (大量的线程可能在阻塞等待IO,多创建一些线程来充分利用好CPU的多核架构)

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

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

相关文章

JUC之Java对象内存布局

Java对象 对象在堆中的存储布局 它保存了什么 对象指向它的类元数据的指针&#xff0c;虚拟机通过这个指针来确定这个对象是哪个类的实例 对象头有多大&#xff1f;在64位系统中&#xff0c;Mark Word占了8个字节&#xff0c;类型指针占了8个字节&#xff0c;一共是16个字…

uniapp——第2篇:编写vue语法

前提&#xff0c;建议先学会前端几大基础&#xff1a;HTML、CSS、JS、Ajax&#xff0c;还有一定要会Vue!&#xff08;Vue2\Vue3&#xff09;都要会&#xff01;&#xff01;&#xff01;不然不好懂 一、去哪写&#xff1f; 就在【pages】的你的人一个页面文件夹里的【.vue】文…

中间件 | RPC - [Dubbo]

INDEX 1 Dubbo 与 web 容器的关系2 注册发现流程3 服务配置3.1 注册方式 & 订阅方式3.2 服务导出3.3 配置参数 4 底层技术4.1 Dubbo 的 spi 机制4.2 Dubbo 的线程池4.3 Dubbo 的负载均衡策略4.3 Dubbo 的协议 1 Dubbo 与 web 容器的关系 dubbo 本质上是一个 RPC 框架&…

计算机二级Python题目13

目录 1. 基本题 1.1 基本题1 1.2 基本题2 1.3 基本题3 2. turtle画图 3. 大题 3.1 大题1 3.2 大题2 1. 基本题 1.1 基本题1 lseval(input()) s"" for item in ls:if type(item)type("香山"):s item print(s) 1.2 基本题2 import random random.se…

使用tui-image-editor 图片编辑 标注图片

需求背景&#xff1a; 鼠标悬浮在图片上 出现编辑按钮 点击编辑 对该图片进行编辑&#xff08;输入文案、涂鸦、标记、裁剪等&#xff09; 可以体验一下它线上编辑器 Image-editor | TOAST UI :: Make Your Web Delicious! 使用 首先在你的前端项目中安装&#xff1a; np…

python-在图片上标实心圆点

代码&#xff1a; from PIL import Image, ImageDraw# 打开图像 image_path path_to_your_image.jpg image Image.open(image_path)# 创建一个可以在上面绘图的对象 draw ImageDraw.Draw(image)# 设置圆点的坐标和颜色 x 100 # 圆点的x坐标 y 100 # 圆点的y坐标 color …

【JVM】GCRoot

GC root原理 通过对枚举GCroot对象做引用可达性分析&#xff0c;即从GC root对象开始&#xff0c;向下搜索&#xff0c;形成的路径称之为 引用链。如果一个对象到GC roots对象没有任何引用&#xff0c;没有形成引用链&#xff0c;那么该对象等待GC回收。 可以作为GC Roots的对…

Vue命令式组件的编写与应用

目录 1.引言 2.传统的组件 3.命令式组件 4.命令式组件的应用场景 1.引言 大家好&#xff01;今天我们来聊聊Vue.js中的一个有趣话题——命令式组件。你有没有觉得&#xff0c;有时候我们在Vue模板里写组件&#xff0c;就像是在玩搭积木&#xff0c;每个积木都有固定的形状…

第二百零六回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"给geolocator插件提交问题的结果"相关的内容&#xff0c;本章回中将介绍自定义标题栏.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…

set与zset数据类型

set类型基础 redis集合(set)类型和list列表类型类似&#xff0c;都可以用来存储多个字符串元素的 集合。但是和list不同的是set集合当中不允许重复的元素。而且set集合当中元素是没有顺序的&#xff0c;不存在元素下标。 redis的set类型是使用哈希表构造的&#xff0c;因此复…

Java面向对象案例之描述专业和学生(4)

类的方法图 学生类&#xff1a; 属性&#xff1a;学号&#xff0c;姓名&#xff0c;年龄&#xff0c;所学习的专业方法&#xff1a;学习的方法&#xff0c;描述学习状态。描述内容包括姓名、学号、年龄、所学习的专业信息 专业类&#xff1a; 属性&#xff1a;专业编号&#xf…

阅读 - 二维码扫码登录原理

在日常生活中&#xff0c;二维码出现在很多场景&#xff0c;比如超市支付、系统登录、应用下载等等。了解二维码的原理&#xff0c;可以为技术人员在技术选型时提供新的思路。对于非技术人员呢&#xff0c;除了解惑&#xff0c;还可以引导他更好地辨别生活中遇到的各种二维码&a…

线性回归 quickstart

构建一元一次方程 100个&#xff08;X, y &#xff09;&#xff0c;大概是’y3x4’ import numpy as npnp.random.seed(42) # to make this code example reproducible m 100 # number of instances X 2 * np.random.rand(m, 1) # column vector y 4 3 * X np.random…

深度揭秘HW中的灰色技术(盗号,个人实时定位,远程监听)

xss漏洞&#xff1a;是数量最多的漏洞 cross-site scripting 跨站脚本攻击 1.反射型xss&#xff1a;代码存在于网址中&#xff0c;将存在恶意代码的链接发给用户&#xff0c;点击后才能攻击成功实施。 2.存储型xss&#xff1a;指Web应用程序会将用户输入的数据信息保持在服务…

2024批量下载微博内容导出excel,数据包含微博链接,内容,点赞数,转发数,评论数,话题等

以歌手李健这个号为例&#xff0c;共抓取727条微博&#xff0c;导出的excel微博数据包含微博链接,微博正文,原始图片链接,被转发微博原始图片链接,是否为原创微博,微博视频链接,发布位置,发布时间,发布工具,点赞数,转发数,评论数,话题等。 第一条微博发布于2010年5月31 。 再根…

电机参数辨识算法(2)——基于高频注入的磁链辨识策略

电机参数辨识算法&#xff08;1&#xff09;——基于高频注入的电感辨识策略-CSDN博客https://blog.csdn.net/m0_46903653/article/details/136722750?spm1001.2014.3001.5501上一期已经讲过了电感辨识方法。 今天这是参数辨识的第二期&#xff0c;今天来简单看看磁链的辨识。…

(六)Android布局类型(表格布局TableLayout)

表格布局&#xff08;TableLayout&#xff09;&#xff0c;呈现行列方式&#xff0c;无法设置列&#xff0c;可以设置行&#xff0c;行数由TableRow对象个数决定。下图中有两个TableRow元素&#xff0c;所以&#xff0c;说明表格布局中有两行。 将内容填充到行中 第一行中&…

【ollama】(7):使用Nvidia Jetson Nano设备,成功运行ollama,运行qwen:0.5b-chat,速度还可以,可以做创新项目了

1&#xff0c;视频地址 https://www.bilibili.com/video/BV1Pj421o7W5/ 【ollama】&#xff08;7&#xff09;&#xff1a;使用Nvidia Jetson Nano设备&#xff0c;成功运行ollama&#xff0c;运行qwen:0.5b-chat&#xff0c;速度还可以&#xff0c;可以做创新项目了 2&#x…

【NC223888】红色和紫色

题目 红色和紫色 博弈论&#xff0c;想得出来思路就简单&#xff0c;想不出来就难。一般使用猜测法。 思路 如果小红随意取一个格子涂色&#xff0c;那么小紫怎么涂色才是她的最优选择呢&#xff1f; 假设小紫只能选择小红涂色的格子的相邻格子或者是最近斜对角的一个格子涂色…

浅易理解:卷积神经网络(CNN)

浅易理解卷积神经网络流程 本文的目录&#xff1a; 1 什么卷积神经网络 2 输入层 3 卷积层 4 池化层 5 全连接层 传统的多层神经网络只有 输入层、隐藏层、输出层 卷积神经网络&#xff08;CNN)&#xff1a; 在多层神经网络的基础上&#xff0c;加入了更加有效的特征学习部分…