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

2024-03-16 14:28

本文主要是介绍消息队列思想学习(以及池化思想延展),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

消息队列的功能

消息中间件必备

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

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

弹性线程池 [核心参数: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的多核架构)

这篇关于消息队列思想学习(以及池化思想延展)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/815761

相关文章

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

springboot rocketmq配置生产者和消息者的步骤

《springbootrocketmq配置生产者和消息者的步骤》本文介绍了如何在SpringBoot中集成RocketMQ,包括添加依赖、配置application.yml、创建生产者和消费者,并展... 目录1. 添加依赖2. 配置application.yml3. 创建生产者4. 创建消费者5. 使用在

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每