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

消息队列(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.pswp.cn/news/913994.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…