理解消息队列

news/2024/10/31 0:51:47/

消息队列(Message Queue)有下面四大作用:

  • 解耦。几个业务系统之间可以通过 MQ 解耦,例如做数据同步
  • 数据的顺序性和可恢复性
  • 异步通讯
  • 缓冲能力

MQ_7">理解 MQ

MQ 的前两个特点且不说,我们看看另外两个的。

MQ__RPC__10">异步通讯: MQ 与 RPC 区别

MQ 与 RPC 区别的切入,可以很好地理解 MQ 的异步能力。

首先,我们了解到 RPC(远程过程调用)通信本质上是一个同步过程,这就意味着在 RPC 方法调用期间,当前执行线程必须等待方法调用完全结束才能继续执行后续的操作。这种等待会增加系统的延迟,并可能影响用户体验,特别是在高并发场景下。

相比之下,消息队列采用的是天然的异步通信模式,即发送者和接收者之间可以独立地发送和接收消息,这种方式有效地解决了 RPC 在异步性和用户体验上的局限性。不过,异步通信模式也引入了额外的复杂性,比如需要处理消息传递的可靠性和顺序等问题。

正因为如此,在现代的大规模分布式系统中,通常会结合使用 RPC 和消息队列这两种通信机制,以此来平衡系统的性能需求和复杂度,同时解决多进程间的通信问题。

缓冲能力

消息队列的另一个关键特性是其出色的缓冲能力。由于消息队列可以配置成具有非常大的存储容量,尤其是在使用磁盘存储的情况下,几乎可以视为拥有无限的存储空间。这使得在流量高峰时段,系统能够暂时存储大量涌入的消息,然后在后续较低峰的时段内逐步处理这些消息,从而避免了因瞬时负载过大而导致的服务中断或系统崩溃。

例如,在电子商务网站进行限时抢购活动时,这类场景通常伴随着极高的瞬间流量冲击。此时,消息队列的高容量缓冲功能就显得尤为重要,它能够有效地吸收这股“洪峰”,确保系统的稳定运行。以下是一个简化版的秒杀业务UML序列图,展示了在这个场景中如何通过引入消息队列来解决问题。消息队列就像是一个巨大的缓冲池,可以吸收大量的并发请求,并且基本上保持了请求的原始顺序。接着,后端的服务(可能是部署在多台服务器上的)可以从容地处理队列中的秒杀请求(实现先到先得的原则),并将成功抢购的结果记录到数据库中以备查询。

在这里插入图片描述

MQ__26">MQ 发展情况

市场上现有的消息队列产品,可以根据它们的发展阶段和技术先进性分为三个世代。

第一代消息队列起源于 J2EE 时代,它们主要关注企业级特性,例如消息的持久化存储和事务支持,这些产品通常遵循 JMS 规范。这一时期的消息中间件一般作为 J2EE 套件的一部分出售。然而,随着 J2EE 时代的逐渐淡出,多数商业消息中间件已经逐渐被淘汰。在开源领域,仅剩少数几个项目仍在活跃,其中最为人所知的就是 Apache 的 ActiveMQ 和 JBoss 的 HornetQ。后来,JBoss 将 HornetQ 的源代码捐赠给了 Apache ActiveMQ 项目组,双方共同开发了 ActiveMQ Artemis。从2016年起,JBoss EAP7 企业版开始使用 ActiveMQ Artemis 替代之前的 HornetQ,而 RedHat 的 JBoss A-MQ 也基于 ActiveMQ 构建。尽管现在基于 J2EE 架构的应用减少了,但仍有部分重要商业软件依赖于这些传统消息队列。据 Gartner 报告显示,IBM MQ 在2016年占据了66%的市场份额。

第二代消息队列是在 Java 时代之后出现的。由于 Java 时代的中间件市场被 IBM 和 Tibco 主导,缺乏开放性和竞争,因此出现了一些试图打破这种局面的“挑战者”。这些团体推动了 AMQP(高级消息队列协议)的发展,这是一种开放的标准,旨在鼓励更多厂商实现兼容 AMQP 的产品。这一努力取得了成功,RabbitMQ 成为首个知名的支持 AMQP 的开源产品,自2007年发布以来,已成为最流行的消息队列之一。此外,AMQP 的普及还促进了 Java 领域的变革,例如 Apache 的 Qpid 项目支持 AMQP 协议,并提供了多种语言的支持,而 ActiveMQ 也在2013年开始支持 AMQP。

第三代消息队列是互联网时代的产物,它们的设计理念更为现代化,通常采用分布式架构,并利用 ZooKeeper 进行集群管理。这一代的代表产品是 LinkedIn 开源的 Kafka,它以其出色的可扩展性和高性能著称。Kafka 适用于多种数据管道和消息系统,许多重要的分布式处理框架如 Cloudera、Apache Storm 和 Spark 都支持与 Kafka 集成。在国内,一些公司也借鉴了 Kafka 的设计,如搜狐的 Jafka 和阿里巴巴的 RocketMQ。RocketMQ 在阿里巴巴内部被广泛应用,并于2012年开源。尽管开源后的维护一度停滞,但在2016年,阿里巴巴将其捐赠给 Apache 后,仍继续开发闭源版本并在阿里云上作为付费服务提供。


http://www.ppmy.cn/news/1543230.html

相关文章

WPF入门_06资源和样式

目录 1、资源基础介绍 2、静态资源和动态资源区别 3、资源字典 4、共享资源的方法 5、在Custom Control Library中定义和使用共享资源 6、样式 7、样式触发器 1、资源基础介绍 尽管每个元素都提供了Resources属性,但通常在窗口级别上定义资源,如下定义一个字符串资源…

Spring Boot环境下的厨艺社区构建

2 相关技术 2.1 Spring Boot框架简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Sprin…

搜维尔科技:Xsens动作捕捉、Manus数据手套和Faceware面部捕捉技术集成,应用于元宇宙数字人制作解决方案

Xsens动作捕捉、Manus数据手套和Faceware面部捕捉技术集成,能够实现非常逼真且高效的数字人动作和表情捕捉! 硬件连接与数据传输方面: 1.Xsens与Manus的集成:Xsens惯性动作捕捉系统通常可以与Manus的数据手套直接集成。Xsens主要…

每天五分钟深度学习:逻辑回归和神经网络

本文重点 我们要开启深度学习的基础神经网络的学习进程了,但是在开启之前,我们先来回忆一下逻辑回归算法 逻辑回归 逻辑回归的前向传播公式为: 求出预测值a之后,进而求损失 以上就是逻辑回归模型,相信大家已经不是很陌生了,现在我们要学习神经网络了 神经网络和逻辑回…

@Configuration(proxyBeanMethods = false)

结论:标注Configuration(proxyBeanMethods false)注解的配置类,类中被Bean标注的方法将不会被spring通过CGLB代理,但是spring容器中还是有这个bean的,在spring容器中获取的bean(getBean()、Aut…

SpringBoot的自动装配原理详解

详细地探讨 Spring Boot 的自动装配原理,包括其工作机制、内部实现、示例代码以及最佳实践。 1. 什么是自动装配 自动装配是 Spring Boot 的核心功能之一,旨在根据项目的依赖和配置自动配置 Spring 应用的 Beans,避免繁琐的手动配置。这种机…

软件性能测试有哪些方法?上海软件测试中心分享

软件的性能是该软件的一种非功能性,关注的不是软件能否完成特定功能,而是在完成该功能时所展现出的及时性。软件性能是衡量某项工作完成效果的一个重要因素,也是衡量软件质量的重要指标之一,因此软件性能测试十分重要。软件性能测…

Three.js Shader 与自定义材质—深入理解与应用

开发领域:前端开发 | AI 应用 | Web3D | 元宇宙 技术栈:JavaScript、React、ThreeJs、WebGL、Go 经验经验:6 年 前端开发经验,专注于图形渲染和 AI 技术 开源项目:github 晓智元宇宙、数字孪生引擎、前端面试题 大家好…