《消息队列》专栏介绍

news2024/12/25 9:10:33

《消息队列》专栏介绍

目录

  • 《消息队列》专栏介绍
  • 专栏导言
  • 什么是消息队列呢?
        • 应用场景(作用)
  • 为什么要用消息队列呢?
        • 异步处理
        • 削峰填谷
    • 举个例子
  • 分布式消息队列的优势
        • 应用解耦优点
        • 发布订阅优点
  • 分布式消息队列应用场景
  • 不同消息队列的对比
  • 为什么需要开一个专栏来将消息队列
  • 关于更新

专栏导言

在当今快节奏的数字化世界中,实时性和可靠性是现代软件开发中的关键词。为了满足用户对即时反馈和高性能的需求,开发人员需要寻找一种高效的通信机制。而消息队列作为一种强大的解决方案,正变得越来越受欢迎。

想象一下,你正在使用一个电商应用程序,下单后希望立即收到订单确认。但是,如果应用程序处理订单的过程变得非常耗时,你可能会感到沮丧。这就是消息队列的用武之地。通过将任务异步处理,应用程序可以立即发送订单确认消息给你,然后在后台处理订单,而不会对用户体验产生任何延迟。

我们现在假设一个开发情景:如果你的系统功能越来越多,长耗时的任务越来越多,系统会越来越复杂,当然我们可以开线程池来解决(我会单独写一篇博客来将JUC线程池的实现),但是线程池是有缺陷的,他只能通过单机部署,如果我们用户量大,改为分布式,多台服务器部署(假设有m台),每个服务器都需要有n个线程,那就需要m*n个线程,会超出服务的限制,资源也会出现抢占。

那么如何解决呢?

  • 服务拆分(应用解耦):其实我们可以把长耗时、消耗很多的任务把它单独抽成一个程序,不要影响主业务。
  • 解决方案:可以有一个中间人,让中间人帮我们去连接两个系统(比如核心系统和智能生成业务)

什么是消息队列呢?

  1. 简单来说,消息队列是一种允许应用程序之间异步通信的机制。它通过解耦生产者和消费者之间的直接依赖关系,实现了高度可扩展性和灵活性。

    消息队列的工作原理很简单:生产者将消息发送到队列中,然后消费者从队列中获取消息并进行处理。这种异步的方式允许生产者和消费者在不需要实时交互的情况下进行独立的操作。这种解耦能力使得消息队列在许多场景下非常有用,例如在分布式系统中进行任务处理、流量控制、日志收集和系统解耦等。未来详细讲解各种场景的使用。

  2. 通俗易懂一些,消息队列就是存储消息的队列。他是一种在应用程序之间传递消息的通信机制。它类似于实际世界中的一个邮箱系统,发送者将消息放入消息队列,接收者从队列中获取消息进行处理。这种异步的方式可以提高系统的性能和可靠性,因为发送者和接收者可以独立地进行操作,并且不需要直接相互依赖。

    消息队列允许不同的应用程序、服务或组件之间解耦,它们可以独立地进行伸缩和维护。消息队列还提供了可靠性和持久性的保证,因为消息可以在发送时进行持久化,并且在接收者处理之前可以进行多次尝试。

  3. 消息队列包含的关键词:存储、消息、队列

    • 存储:存储数据
    • 消息:某种数据结构:比如字符串、对象、二进制、JSON等等
    • 队列:一种先进先出的数据结构

    应用场景(作用)

    在多个不同的系统、应用之间实现消息的传输(也可以存储)。不需要考虑传输应用的编程语言、系统、框架等等。

    例如:可以让Java开发的应用发消息,让PHP开发的应用收消息,这样就不用把所有代码写到同一个项目里 (应用解耦)

为什么要用消息队列呢?

使用消息队列有以下几个主要原因:

  1. 解耦和提高系统可靠性:消息队列提供了解耦的方式,发送方和接收方之间不直接进行通信,通过消息队列中转。这样,即使其中一个组件或者系统出现故障,不会影响到整个系统的正常运行。
  2. 异步处理和提高系统性能:消息队列可以使发送方和接收方异步处理消息。发送方将消息发送到队列中后,不需要等待接收方立即处理,而是可以继续处理其他任务。这样可以提高系统的性能和响应速度。
  3. 缓冲和流量控制:消息队列可以作为缓冲区,用于处理流量峰值。当系统面临突发的请求量增加时,消息队列可以缓冲请求并逐渐处理,避免系统过载。
  4. 同步数据:在分布式系统中,不同组件或者系统之间可能需要共享数据。通过消息队列可以实现数据的同步和共享,保证各个组件之间的数据一致性。
  5. 扩展和灵活性:使用消息队列可以通过增加消费者来实现系统的扩展性,并且消费者可以根据需求灵活地进行扩缩容。这样可以根据实际需求进行系统的调整和优化。

异步处理

生产者发送完消息之后,可以继续去忙别的,消费者想什么时候消费都可以,不会产生阻塞。

削峰填谷

先把用户的请求放到消息队列中,消费者(实际执行操作的应用)可以按照自己的需求,慢慢去取。

举个例子

  • 没有使用消息队列:12点时来了10万个请求,原本情况下,10万个请求都在系统内部立刻处理,很快系统压力过大就宕机了。
  • 使用消息队列:把这10万个请求放到消息队列中,处理系统以自己的恒定速率(比如每秒1个)慢慢执行,从而保护系统、稳定处理。类似于管道一样流水式处理。

分布式消息队列的优势

在如今的后台开发中,最常用的一种消息队列就是分布式消息队列了,也是效率最高的,因此本专栏重点讲解分布式消息队列。

分布式消息队列是消息队列的一种。传统的消息队列通常在单个节点上运行,而分布式消息队列可以在多个节点上分布运行,实现更高的吞吐量和可伸缩性。它可以用于解耦、异步通信和扩展系统等方面的应用。常见的分布式消息队列包括 Apache Kafka、RabbitMQ、ActiveMQ 等。

  1. 数据持久化:它可以把消息集中存储到硬盘里,服务器重启就不会丢失
  2. 可扩展性:可以根据需求,随时增加(或减少)节点,继续保持稳定的服务
  3. 应用解耦:可以连接各个不同语言、框架开发的系统,上这些系统能够灵活传输读取数据
  4. 发布订阅:它可以使发布者将消息发送到一个或多个订阅者,从而实现解耦、可伸缩性和实时性等优势
    1. 解耦性:发布者和订阅者之间是松耦合的,彼此不需要直接通信。发布者只需要将消息发布到特定的主题或频道中,而订阅者只需要订阅感兴趣的主题或频道。这种解耦性使得系统中的组件可以独立地进行开发、维护和扩展。
    2. 可伸缩性:发布订阅模式允许多个订阅者同时接收消息,并且可以动态地添加或移除订阅者。这种可伸缩性使系统能够处理更高的并发量,而不会对性能和可用性产生负面影响。
    3. 实时性:由于发布订阅模式支持多个订阅者同时接收消息,可以更快地将消息传递给订阅者。这种实时性使系统能够实现即时的数据传输和处理,适用于需要快速响应的场景。
    4. 可靠性:分布式消息队列通常提供了消息持久化的机制,可以将消息存储到磁盘上,确保消息不会丢失。即使消费者出现故障,稍后再启动时也可以继续接收之前未处理的消息。

应用解耦优点

不使用消息队列时:

把所有的功能都放在同一个项目中,调用多个子功能时,一个环节错,整个系统就出错

使用了消息队列进行解耦:

  1. 一个系统挂了,不影响另一个系统:如果发货系统挂了,但是不影响到库存系统进行扣减
  2. 系统挂了并恢复后,仍然可以从消息队列当中取出消息,继续执行业务逻辑
  3. 只要发送消息到队列,就可以立刻返回,不用同步调用所有系统,性能更高

订单系统只要将消息发送到消息队列,即可返回,并不需要调用其他的系统,而其他的系统只要从消息队列中获取到消息。

发布订阅优点

发布订阅优势图解:

如果一个非常大的系统要给其他子系统发送通知,最简单直接的方式是大系统直接依次调用小系统

比如QQ:使用QQ来关联了很多应用的消息,比如王者、吃鸡、微信等等

这样做存在的问题:

  1. 每次发通知都要调用很多系统,很麻烦、有可能失败
  2. 新出现的项目(或者说大项目感知不到的项目)无法得到通知
  3. 发布的消息不知道哪个系统需要

解决方案:大的核心系统始终往一个地方(消息队列)去发消息,其他的系统都去订阅这个消息队列(读取这个消息队列中的消息)

分布式消息队列应用场景

未来会详细讲解常用的应用场景

  1. 耗时的场景(异步)
  2. 分布式系统协作(尤其是跨团队、跨业务协作,应用解耦)
  3. 强稳定性的场景(比如金融业务:支付、转账,特久化、可靠性、削峰填谷)
  4. 异步通信:当系统需要在不同模块之间进行异步通信时,分布式消息队列可以提供一种可靠的通信机制。
  5. 解耦应用:当多个应用或服务之间需要解耦,以降低耦合度、提高灵活性和可维护性时,使用分布式消息队列可以实现解耦。
  6. 流量削峰:在高峰期或服务器负载高的情况下,分布式消息队列可以将流量平滑分发到不同的消费者上,避免系统过载。(高并发场景、异步、削峰填谷
  7. 日志处理:对于大规模的日志处理场景,分布式消息队列可以帮助将日志收集、传输和处理进行解耦,并且可以容错和持久化。
  8. 事件驱动架构:在事件驱动的架构中,各个组件通过订阅消息实现解耦,以便在事件发生时进行相应的处理。

不同消息队列的对比

主要是参考以下几个技术指标进行选择对应的消息队列来开发

  1. 吞吐量:IO、并发。(表示单位时间内完成的操作次数、传输的数据量或处理的任务数量)

  2. 时效性:类以延迟,消息的发送、到达时间

  3. 可用性:系统可用的比率(比如1年365天宕机1s,可用率大概X个9)


    可用性的计算公式是:可用时间 / (总时间 - 计划停机时间)。

    总时间 = 365 * 24 * 60 * 60 = 31,536,000 秒。

    计划停机时间 = 1 秒 * 365 天 = 365 秒。

    可用时间 = 总时间 - 计划停机时间 = 31,536,000 - 365 = 31,535,635 秒。

    可用性 = 31,535,635 / 31,536,000 ≈ 0.999988 ≈ 99.9988%。

    所以,该系统的可用性为约99.9988%。

  4. 可靠性:消息不丢失(比如不丢失订单)、功能正常完成

  • 吞吐量(Throughput)指的是系统在单位时间内能够处理的请求或传输的数据量。在消息队列中,吞吐量表示系统能够处理的消息数量或传输的数据量。较高的吞吐量意味着系统能够更快地处理请求或传输数据。

    * 时效性(Latency)指的是从发出请求到收到响应所经历的时间间隔。在消息队列中,时效性表示从消息被发送到消息被接收和处理的时间。较低的时效性意味着消息能够更快地被传输、接收和处理。

消息队列吞吐量(QPS)时效性可用性可靠性优势缺点应用场景
ActiveMQ中等:万级中等成熟的JMS支持、简单易学性能相对较低中小型企业应用,可靠的消息传递和事务
RabbitMQ中等:万级极高(微秒单位)灵活的路由策略、生态好、时效性高、易学对大吞吐量的支持相对较弱复杂的消息路由和灵活的消息处理、适用于大部分的分布式系统
Kafka高:十万级高(毫秒以内)极高极高高吞吐量和低延迟、可靠性、强大的数据流处理能力复杂性较高,初学者上手难度大大数据流处理,日志收集,实时数据流传输、事件流收集传输等
RocketMQ高:十万级高(毫秒)极高极高可靠性、可用性、吞吐量大、分布式事务支持对复杂性的支持相对不足大规模的分布式应用,高可用性和事务一致性要求 适用于金融、电商等对可靠性要求较高的场景,适合大规模的消息处理
ZeroMQ中等:万级简单的消息传递机制缺乏对复杂消息路由的支持轻量级异步通信,构建快速分布式系统
Pulsar高:十万级高(毫秒)极高极高可靠性、可用性很高、基于发布订阅模型、新兴技术结构、云原生架构支持部署和运维相对复杂适用大规模数据处理,实时分析,高并发的分布式系统。适合实时分析、事件流处理、IoT数据处理等。
Apache InLong (Tube)高:十万级数据传输和大数据处理集成社区生态相对较小实时分析,数据集成

为什么需要开一个专栏来将消息队列

为什么我们需要开一个专栏来深入探讨消息队列呢?

  1. 复杂性的增加:

    随着软件系统的不断扩展和发展,系统之间的通信变得越来越复杂。传统的同步通信方式已经无法满足现代分布式系统的要求。消息队列通过提供异步通信的能力,将生产者和消费者解耦,从而简化了系统之间的通信。开设专栏可以帮助读者理解消息队列的基本概念和原理,并掌握如何在复杂系统中应用它们。

  2. 实时性和性能的需求:

    随着用户对实时性和高性能的要求不断增加,开发人员需要寻找一种能够提供快速响应和高吞吐量的通信方式。消息队列能够以异步的方式处理任务,从而提高系统的响应速度和整体性能。通过专栏的介绍,读者可以学习如何利用消息队列来满足这些实时性和性能需求。

  3. 大规模系统的挑战:

    在大规模分布式系统中,有效地处理和管理海量的消息是一项巨大的挑战。消息队列提供了分布式消息传递、负载均衡和容错机制,能够应对系统规模的扩展性和可靠性要求。通过专栏的学习,读者可以了解如何应对大规模系统中的消息处理问题,并学习一些最佳实践和经验。

  4. 应用场景的多样性:

    消息队列在各个领域都有广泛的应用,如微服务架构、实时数据处理、日志收集和分析等。开设专栏可以涵盖各种应用场景,并通过具体案例帮助读者理解如何在实际项目中应用消息队列。这将帮助读者掌握不同领域中消息队列的实现方式和技巧。

  5. 技术知识的普及:

    消息队列是一项复杂的技术,对于初学者来说可能有一定的学习曲线。通过开设专栏,我们可以以通俗易懂的方式介绍消息队列的概念和原理,并提供详细的实例和图解,帮助读者快速入门和理解关键概念。

关于更新

作者是学生党一枚,能力有限,本着学到哪里更新到哪里的原则。因此我所更新到专栏的知识,一定是我在学习的过程中认为十分重要的,并且自己实践过的内容,也当做我个人的笔记记录。当然也难免会有差错,有问题还请大家及时提出,私信或者评论区交流,谢谢大家!

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

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

相关文章

[SSM]MyBatisPlus拓展

五、拓展篇 5.1逻辑删除 在电商网站中,我们会上架很多商品,这些商品下架以后,我们如果将这些商品从数据库中删除,那么在年底统计商品的时候,这个商品要统计的,所以这个商品信息我们是不能删除的。 如果商城…

球谐函数实现环境光照漫反射实践

该文章以及代码主要来自 图形学论文解析与复现:【论文复现】An Efficient Representation for Irradiance Environment Maps 作者:Monica的小甜甜 与原文的不同: 对一些有问题的地方进行了修改添加了注释对有疑问的地方添加了疑问点引入了其…

【笔试强训选择题】Day37.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!! 文章目录 前言一、Day…

camx camera initial

qnx 平台中的camera hal 接口 HAL3Module:chi_hal_override_entry 在android 的中使用Camx 打开com.qti.chi.override.so进行注册hal ops 操作接口 camhal3module.cpp 中的构造函数HAL3Module中 CHIHALOverrideEntry funcCHIHALOverrideEntry reinterpret_cast…

即拼七人拼团系统开发模式的奖励机制都有哪些?

即拼七人拼团是市场上非常火爆的商业模式之一,它通过团购机制、互动社交和抽奖等方式,有效解决了电商平台的复购难题。不仅可以降低商品价格,还能够增加用户的参与感和购物乐趣,提升平台的用户粘性和产品销量。下面就来具体说一下…

驱动轴相机参数设置Web前端界面开发

一、基于Django的Web应用界面的开发: 在Realtimeresults.html上添加一个按钮组件,获取检测到的轴型和车轮信息,点击后可以获取package.json里存放的json数据,效果如下: 实现逻辑:需要从URL设置、视图函数、…

YOLOV8从零搭建一套目标检测系统(修改model结构必看)附一份工业缺陷检测数据集

目录 1.YOLOV8介绍 2.YOLOV8安装 2.1环境配置 3.数据集准备 1.YOLOV8介绍 Yolov8结构图: YoloV8相对于YoloV5的改进点: Replace the C3 module with the C2f module. Replace the first 6x6 Conv with 3x3 Conv in the Backbone. Delete two Convs …

Mysql--事务

事务 开始之前,让我们先想一个场景,有的时候,为了完成某个工作,需要完成多种sql操作 比如转账 再比如下单 第一步 我的账户余额减少 第二步 商品的库存要减少 第三步 订单表中要新增一项 事务的本质,就是为了把多个操…

Excel数学、工程和科学计算插件:FORMULADESK Studio

如果 Excel 是您的武器 - 让我们磨砺您的剑!为整天使用 Excel 的人们提供创新的 Excel 加载项,你需要这个 FORMULADESK Studio。。。 Excel 插件为任何使用 Excel 执行数学、工程和科学计算的人提供了必备工具。 * 将公式视为真正的数学方程 * 为您的公…

vue3中如何实现通过点击不同的按钮切换不同的页面

完成以上需求&#xff0c;我们可以使用vue中的component标签来实现。 component是Vue.js中一个特殊的标签&#xff0c;用于动态地绑定其它组件。它可以与v-bind:is指令一起使用&#xff0c;来决定要渲染哪个组件。下面是示例代码 <template><div class"app-conte…

OpenCV 07(图像滤波器)

一、卷积 什么是图片卷积? 图像卷积就是卷积核在图像上按行滑动遍历像素时不断的相乘求和的过程 步长 步长就是卷积核在图像上移动的步幅. 上面例子中卷积核每次移动一个像素步长的结果, 如果将这个步长修改为2, 结果会如何? 为了充分扫描图片, 步长一般设为1. padding …

【操作系统】电脑上没有IIS怎么办

文章目录 前言一、查看二、解决 前言 有的新机刚开始在计算机-管理-服务下没有IIS网络服务怎么办。 一、查看 桌面计算机/此电脑 鼠标右键&#xff1a;管理 服务和应用 发现没有IIS 二、解决 控制面板 程序和功能 启动或关闭Windows功能 IIS相关的所有功能选中&#xff…

【JavaScript】JS语法入门到实战

文章目录 一、初识JavaScript1. 什么是JavaScript&#xff1f;2. JavaScript 和 HTML 和 CSS 之间的关系3. JavaScript的运行过程4. JavaScript的组成 二、JavaScript的书写形式三、变量1. 输入输出2. 变量的使用3. 数据类型 四、运算符五、分支和循环语句1. 分支语句2. 循环语…

将PyCharm中的终端运行前面的PS修改成当前环境

最近使用Pycharm中的Terminal来pip安装一些pakage&#xff0c;发现Terminal运行前面的显示的是PS&#xff0c;然后输入安装指令报错。“python无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。” 解决方法&#xff1a; 只需要在pycharm的设置中修改一些termi…

Java缓存理解

CPU占用&#xff1a;如果你有某些应用需要消耗大量的cpu去计算&#xff0c;比如正则表达式&#xff0c;如果你使用正则表达式比较频繁&#xff0c;而其又占用了很多CPU的话&#xff0c;那你就应该使用缓存将正则表达式的结果给缓存下来。 数据库IO性能&#xff1a;如果发现有大…

基于YOLOv8和WiderFace数据集的人脸目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8和WiderFace数据集的人脸目标检测系统可用于日常生活中检测与定位人脸目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算…

数据结构(C语言版)概念、数据类型、线性表

数据结构&#xff08;C语言&#xff09;基本概念 数据的基本单位 数据的基本单位是位&#xff08;bit&#xff09;和字节&#xff08;byte&#xff09;。位是最小的存储单位&#xff0c;它可以表示一个二进制的0或1。字节由8个位组成&#xff0c;用于表示一个字符或数字。在计…

STM32 Nucleo-144开发板开箱bring-up

文章目录 1. 开篇2. 开发环境搭建2.1 下载官方例程2.2 ST-Link安装 3. STM32F446ZE demo工程3.1 STM32F446ZE简介3.2 跑个demo试一试 1. 开篇 最近做项目&#xff0c;用到STM32F446ZET6这款MCU&#xff0c;为了赶进度&#xff0c;前期软件需要提前开发&#xff0c;于是在某宝买…

基于FPGA的RGB图像转Ycbcr实现,包括tb测试文件以及MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将FPGA的数据导入到matlab进行显示 2.算法运行软件版本 Vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps // // Company: // E…

企业微信后台管理-关联小程序、H5/web

企业微信后台管理-小程序、web 应用-关联小程序应用-绑定h5(web页面的app)企业微信-工作台 应用-关联小程序 企业微信后台管理地址&#xff0c;管理员扫码登录后台管理&#xff0c;找到应用管理-自建-创建应用/小程序。 填写项目相关信息之后&#xff0c;如下图。 点击关联小…