主流消息队列技术总结和对比

消息队列(Message Queue,简称 MQ)作为构建分布式互联网应用的关键组件,松耦合的架构设计能显著提升系统的可用性与可扩展性。在分布式系统中扮演着至关重要的角色,主要承担着实现异步消息传递、应用解耦、流量削峰以及消息通讯等关键功能。

一、消息队列的应用场景

1、异步处理

以用户注册并需发送注册邮件和短信为例。用户完成注册后,系统需要执行发送注册邮件和注册短信这两项操作。传统的处理方式有串行和并行两种,具体如下:

1)串行方式:先将注册信息成功写入数据库,接着发送注册邮件,最后发送注册短信。只有当这三个任务全部完成后,才会向客户端返回结果。

2)并行方式:在将注册信息成功写入数据库后,同时发送注册邮件和注册短信。同样,要等这三个任务都完成,再向客户端返回结果。与串行方式相比,并行方式能缩短处理时间。假设每个业务节点的处理时间均为 50 毫秒,不考虑网络等其他开销,那么串行方式的总耗时为 150 毫秒,并行方式的总耗时则可能为 100 毫秒。由于 CPU 在单位时间内处理的请求数是固定的,假设 CPU1 秒内的吞吐量是 100 次,那么串行方式 1 秒内 CPU 可处理的请求量约为 7 次(1000ms/150ms),并行方式则约为 10 次(1000ms/100ms)。

而引入消息队列后,对于非必须的业务逻辑,可采用异步处理方式。改造后的架构下,用户的响应时间相当于注册信息写入数据库的时间,即 50 毫秒。因为注册邮件和发送短信的请求写入消息队列后便直接返回,且写入消息队列的速度极快,耗时基本可忽略不计。如此一来,系统的吞吐量可提升至每秒 20 QPS,相比串行方式提高了 3 倍,相比并行方式提高了 2 倍。

2、应用解耦

以用户下单购买业务为例。在传统模式中,用户下单后,订单系统需要调用库存系统的接口来通知库存系统。这种模式存在明显缺点:一是若库存系统无法访问,订单减库存操作就会失败,进而导致订单失败;二是订单系统与库存系统存在紧密耦合。

引入应用消息队列后的方案则有效解决了这些问题:

1)订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,随后向用户返回订单下单成功的信息。

2)库存系统:通过订阅下单的消息,采用拉取或推送的方式获取下单信息,然后根据这些信息进行库存操作。

即便在下单时库存系统无法正常使用,也不会影响用户正常下单,因为订单系统在将信息写入消息队列后,就不再关注后续操作了。这就实现了订单系统与库存系统的应用解耦。

3、流量削峰

流量削峰是消息队列的又一常用场景,在秒杀或团抢活动中应用广泛。秒杀活动往往会因参与人数过多导致流量暴增,极易使应用崩溃。为解决这一问题,可在应用前端加入消息队列,其作用主要有两点:一是能够控制参与活动的人数;二是可以缓解短时间内的高流量对应用造成的压力。

具体实现方式如下:

1)服务器接收用户的请求后,首先将其写入消息队列。若消息队列的长度超过最大限制,就直接抛弃该用户请求或引导用户跳转到错误页面。

2)秒杀业务根据消息队列中的请求信息,进行后续的处理。

4、消息通讯

消息通讯是指消息队列通常内置了高效的通信机制,因此也可用于消息通讯。例如,可实现点对点消息队列或聊天室等功能。这实际上对应了消息队列的两种消息模式,即点对点模式和发布订阅模式。

二、常用消息队列各项对比

特性

ActiveMQ

RabbitMQ

RocketMQ

Kafka

生产者消费者模式(Producer-Consumer)

支持

支持

支持

支持

发布订阅模式(Publish-Subscribe)

支持

支持

支持

支持

请求回应模型(Request-Reply)

支持

支持

不支持

不支持

API 完备性

高

高

高

高

多语言支持

支持

支持

只支持 JAVA

支持

单机吞吐量

万级

万级

万级

十万级

消息延迟

无

微秒级

毫秒级

毫秒级

可用性

高(主从)

高(主从)

非常高(分布式)

非常高(分布式)

消息丢失

低

低

理论上不会丢失

理论上不会丢失

文档的完备性

高

高

高

高

提供快速入门

有

有

有

有

社区活跃度

高

高

中

高

商业支持

无

无

阿里云

主流云服务厂商 

三、ActiveMQ、RabbitMQ、RocketMQ、Kafka 特点

ActiveMQ

ActiveMQ 是一个历史悠久的开源项目,在众多产品中都有应用。它实现了 JMS1.1 规范,能与 spring-jms 轻松融合,还支持多种协议。不过,它不够轻巧(源代码比 RocketMQ 多),支持持久化到数据库,但在队列数量较多的情况下,表现欠佳。

RabbitMQ

相比 Kafka,RabbitMQ 更为成熟,支持 AMQP 事务处理。在可靠性方面,它超过 Kafka;在性能方面,又优于 ActiveMQ。

RocketMQ

RocketMQ 是阿里开源的消息中间件,目前正在 Apache 进行孵化。它采用纯 Java 开发,具有高吞吐量、高可用性的特点,适合大规模分布式系统应用。其设计思路源于 Kafka,但并非简单复制,而是对消息的可靠传输及事务性进行了优化。目前,RocketMQ 在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog 分发等场景,支撑了阿里多次双十一活动。由于它是阿里从实践中发展而来的产品,部分接口和 API 的通用性不是很强。但它的可靠性毋庸置疑,且在性能上与 Kafka 一脉相承甚至更优,还支持海量消息堆积。

Kafka

Kafka 的设计初衷是处理日志,不支持 AMQP 事务处理,可将其视为一个日志系统,针对性很强,因此并不具备成熟 MQ 应有的全部特性。不过,Kafka 的性能(吞吐量、tps)强于 RabbitMQ,在处理大数据量的快速处理场景中,比 RabbitMQ 更具优势。

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

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

相关文章

数据结构 顺序表(3)---顺序表的应用

在之间的两篇文章中,我们着重讲了顺序表及顺序表的实现。今天这篇文章我们将简单讲解关于顺序表的三个算法题。这三个题也都属于力扣上的经典例题。1.例题1:移除元素例题来源(力扣) : https://leetcode.cn/problems/remove-element/description/这是一道数组操作算法…

逆向入门(9)汇编篇-bound指令的学习

看程序的时候碰到这么一行没见过的代码,简单记录一下 00427AC8 |. 6215 3C7B4200 |bound edx,qword ptr ds:[0x427B3C]这里是用到了bound指令,这是 x86 汇编中的指令,用于检查数组索引是否在有效范围内。 指令解析 bound edx, qword ptr ds…

【web应用】若依框架中,使用Echarts导出报表为PDF文件

文章目录前言一、Echarts准备工作1、查看是否安装了Echarts2、Echarts导入script 中3、使用Echarts创建图表二、报表制作打印html2canvas和jsPDF准备工作1、安装html2canvas和jsPDF依赖包2、html2canvas和jsPDF引用到script中3、制作并打印报表三、导出结果前言 若依框架前端中…

优选算法 --(双指针算法 1~8)

引言:此专栏为记录算法学习,本专题作为算法学习的第一部分,优选算法专题共计100题,分为不同小模块进行,算法学习需坚持积累,时代不会辜负长期主义者,仅以此句,与君共勉。 讲解算法分…

XRDMatch代码复现与分析报告

XRDMatch代码复现与分析报告 1. 项目概述 XRDMatch是一个用于X射线衍射(XRD)数据匹配和分析的开源工具,由zhengwan-chem开发并托管在GitHub上。本项目旨在复现XRDMatch的核心功能,并对其实现进行详细分析。 X射线衍射是材料科学中用于确定晶体结构的重要技术,通过分析衍射…

SpringAI×Ollama:Java生态无缝集成本地大模型实践指南

摘要 随着大语言模型(LLM)的普及,数据隐私和技术栈统一性成为企业级AI应用的核心挑战。本文系统阐述如何通过SpringAI框架与Ollama本地化模型引擎的结合,构建安全高效的生成式AI应用。通过实战案例解析配置优化、流式响应、工具调用等关键技术,为Java开发者提供零Python依…

从采购申请到报废核销:如何用数字化缝合企业物资管理的“断点”?

在企业的日常运营中,物资管理是一项至关重要的工作。从采购申请到物资的入库、使用,再到最终的报废核销,这一系列流程就像一条长长的链条,环环相扣。然而,在传统管理模式下,这条链条上却存在着诸多“断点”…

AVL平衡二叉树

01. 初始AVL树 AVL树是最早发明的自平衡二叉搜索树。在AVL树中,任何节点的两个子树的高度差(平衡因子)最多为1,这使得AVL树能够保持较好的平衡性,从而保证查找、插入和删除操作的时间复杂度都是O(log n)。包含n个节点…

教育行业可以采用Html5全链路对视频进行加密?有什么优势?

文章目录前言一、什么是Html5加密?二、使用Html5对视频加密的好处三、如何采用Html5全链路对视频进行加密?四、教育行业采用Html5全链路视频加密有什么优势?总结前言 面对优质课程盗录传播的行业痛点,教育机构如何守护核心知识产…

Vue3 tailwindcss

1、安装tailwindcsspnpm i -D tailwindcss postcss autoprefixer # yarn add -D tailwindcss postcss autoprefixer # npm i -D tailwindcss postcss autoprefixer2、 创建TailwindCSS配置文件npx tailwindcss init -ptailwind.config.js/** type {import(tailwindcss).Config}…

提示工程:解锁大模型潜力的核心密码

以下是对Lilian Weng的提示工程权威指南(原文链接)的深度解析与博客化重构,融入最新行业实践: 提示工程:解锁大模型潜力的核心密码 ——从基础技巧到工业级解决方案全解析 一、重新定义人机交互范式 传统编程 vs 提示…

Python3邮件发送全指南:文本、HTML与附件

在 Python3 中,使用内置的 smtplib 库和 email 模块发送邮件是一个常见的需求。以下是更详细的实现指南,包含各种场景的解决方案和技术细节:一、发送纯文本邮件的完整实现准备工作:确保已开通 SMTP 服务(各邮箱开启方式…

CSS和CSS3区别对比

CSS(层叠样式表)与CSS3(CSS的第三个版本)的区别主要体现在功能扩展、语法特性以及应用场景等方面。以下是两者的核心对比: 一、核心概念与版本关系CSS:是基础样式表语言,用于分离网页内容与样式…

JVM--监控和故障处理工具

一、命令行工具 1. jps (Java Process Status) 作用:列出当前系统中所有的 Java 进程 常用命令: jps -l # 显示进程ID和主类全名 jps -v # 显示JVM启动参数 输出示例: 1234 com.example.MainApp 5678 org.apache.catalina.startup.Bootstra…

推荐 7 个本周 yyds 的 GitHub 项目。

01.开源的 CRM 软件这是一个开源的客户关系管理(CRM)系统,现在又 32.5K 的 Star。为企业和团队提供比肩 Salesforce 等商业产品的功能,同时强调用户自主权、数据自由与高度可定制性。开源地址:https://github.com/twen…

linux网络编程之单reactor模型(一)

Reactor 是一种事件驱动的设计模式(Event-Driven Pattern),主要用于处理高并发 I/O,特别适合网络服务器场景。它通过一个多路复用机制监听多个事件源(如 socket 文件描述符),并在事件就绪时将事…

浏览器重绘与重排

深入解析浏览器渲染:重排(Reflow)与重绘(Repaint)的性能陷阱与优化策略作为一名前端开发者,你是否遇到过界面突然卡顿、滚动时页面抖动或输入框响应迟钝?这些常见性能问题背后,往往是重排与重绘在作祟。本文将深入剖析浏览器渲染机…

day049-初识Ansible与常用模块

文章目录0. 老男孩思想-人脉的本质1. Ansible1.1 密钥认证1.2 安装ansible1.3 添加ansible配置文件1.4 配置主机清单文件(Inventory)1.5 测试1.6 ansible的模块思想1.7 command模块1.8 需求:每台服务器的密码都不同,怎么批量执行业…

力扣网编程134题:加油站(双指针)

一. 简介 前面两篇文章使用暴力解法,或者贪心算法解决了力扣网的加油站问题,文章如下: 力扣网编程150题:加油站(暴力解法)-CSDN博客 力扣网编程150题:加油站(贪心解法&#xff09…

XPath 语法【Web 自动化-定位方法】

🧭 XPath 语法简介(Web 自动化核心定位手段)一、XPath 是什么?XPath(XML Path Language)是用于在 XML/HTML 文档中定位节点的语言,由 W3C 标准定义。浏览器支持的是 XPath 1.0。应用场景广泛&am…