消息队列简介

在当今的分布式系统架构中,消息队列(Message Queue,MQ)扮演着举足轻重的角色。随着业务规模的不断扩大和系统复杂度的日益提升,各个组件之间的通信和协同变得愈发关键 。消息队列作为一种异步的通信机制,允许不同的系统或进程在无需直接交互的情况下进行通信,有效地解耦了系统组件,提高了系统的灵活性、可扩展性和可靠性。它就像是一个可靠的信使,在分布式系统的各个角落传递着信息,确保数据的高效传输和处理。

在众多消息队列中,Kafka、RabbitMQ 和 RocketMQ 脱颖而出,成为了开发者们广泛使用的选择。Kafka 以其高吞吐量和卓越的分布式流处理能力著称,被大量应用于大数据领域和日志处理场景;RabbitMQ 凭借其丰富的功能和对多种协议的支持,在金融、电商等对可靠性要求极高的行业中备受青睐;RocketMQ 则融合了高吞吐量和分布式事务等特性,在阿里等大型互联网企业的核心业务中发挥着关键作用。接下来,我们将深入剖析这三款消息队列的特点、应用场景以及如何在它们之间进行选型。

三款消息队列的基本介绍

Kafka

Kafka 最初是由 LinkedIn 公司开发,用于解决其内部的数据管道问题 。在 2010 年前后,LinkedIn 使用 ActiveMQ 进行数据交换,但 ActiveMQ 无法满足其对数据传递系统的要求,经常出现消息阻塞或服务无法正常访问的情况。于是,LinkedIn 决定自研消息传递系统,Kafka 应运而生,并于 2011 年初开源,2012 年 10 月 23 日由 Apache Incubator 孵化出站。Kafka 的命名来源于作家弗朗茨・卡夫卡,开发者选择这个名字是因为它是 “一个用于优化写作的系统”,且开发者喜欢卡夫卡的作品 。

Kafka 被设计为一个分布式、分区的、多副本的、多订阅者,基于 Zookeeper 协调的分布式日志系统,也可当做 MQ 系统 。它具有高吞吐量、可持久化、分布式、多订阅者等特点,能高效处理海量数据,广泛应用于大数据领域和日志处理场景。随着发展,Kafka 从 0.8 版本开始提供与数据处理有关的组件,如 Kafka Streams(轻量化流计算库)和 Kafka Connect(数据同步工具),逐渐向实时流处理平台方向发展。

RabbitMQ

RabbitMQ 最初由 Rabbit Technologies 公司开发,基于 AMQP(高级消息队列协议)标准 。AMQP 是一种开放的网络协议,用于不同应用程序之间的消息传递。2007 年,RabbitMQ 发布第一个版本,之后不断发展完善,被广泛应用于各种规模的企业和互联网项目中。2010 年,Rabbit Technologies 被 SpringSource(后被 VMware 收购)收购,进一步推动了其发展和推广 。

RabbitMQ 支持多种消息传递模式,如 Direct(直连)、Fanout(广播)、Topic(主题)和 Headers(头信息),可实现不同的消息路由策略,满足复杂业务需求 。它通过集群模式和镜像队列等机制保证高可用性,支持灵活的路由,能确保消息准确发送到目标队列。RabbitMQ 常用于分布式系统中的子系统通信和协作,以及任务队列场景,如处理视频转码、文件压缩、数据分析等耗时任务。

RocketMQ

RocketMQ 诞生于 2012 年,是阿里中间件团队为支撑超大规模电商互联网架构而研发的 。当时,业界已有的消息队列,如 IBM MQ、ActiveMQ、RabbitMQ 等,均诞生于传统企业级应用场景,无法满足互联网对高并发、无限横向扩展的苛刻要求。例如,RabbitMQ 的队列流量与存储负载是单机的,无法横向扩展;Kafka 主要用于日志传输场景,稳定性未经过大规模核心业务验证,且无法满足电商对复杂消息功能特性的诉求,如消息过滤、延迟消息等,也无法解决电商交易对分布式一致性的要求 。

为解决电商业务对消息队列高性能、一致性、无限扩展等需求,RocketMQ 应运而生。它具备丰富的消息特性,如分布式事务消息(保障交易上下游业务订单状态最终一致,成为异步消息一致性方案的事实标准)、顺序消息(满足顺序一致性需求) 。RocketMQ 稳定性强,从产品层面对稳定性进行全方位建设,提供消息回溯、消息轨迹、死信队列等能力;高性能,采用 Shared-nothing 的分布式架构,架构极简,零外部依赖,即便在双十一极限流量下,写消息延迟也很低,吞吐量具备无限扩展能力,连续十年支撑双十一万亿级消息洪峰,为百万级客户端实例提供低延迟消息服务 。2015 年 RocketMQ 上云,成为业界首个提供公共云 SaaS 形态的开源消息队列;2016 年,阿里将其捐赠给 Apache,2017 年孵化毕业,成为国内首个 TLP 的互联网中间件 。2022 年,RocketMQ 5.0 正式发布,全面迈进云原生时代,架构走向云原生化,覆盖更多业务场景。

详细对比分析

(一)架构设计

  • Kafka:Kafka 采用分布式架构,由多个 Broker 组成集群 。每个 Broker 都是一个独立的 Kafka 服务器实例,负责存储和处理消息。消息以 Topic 为单位进行分类,每个 Topic 又可分为多个 Partition,分区是 Kafka 并行处理的基本单位,数据均匀分布在各个分区上 。通过 Zookeeper(旧版)或 KRaft(新版自洽模式)协调集群,Kafka 实现了高可用和负载均衡。每个分区可以配置多个副本,其中一个为 Leader 副本,负责处理读写请求,其他为 Follower 副本,从 Leader 副本同步数据 。当 Leader 副本所在的 Broker 宕机时,会在 Follower 副本中选举新的 Leader,确保服务的连续性。例如,在一个日志收集系统中,Kafka 集群可以轻松应对大量日志数据的写入和读取,通过分区和副本机制保证数据的可靠性和系统的高可用性。
  • RabbitMQ:基于 AMQP 协议,RabbitMQ 的架构包含 Producer(生产者)、Consumer(消费者)、Exchange(交换机)、Queue(队列)和 Broker(代理) 。生产者通过信道(Channel)将消息发送到交换机,交换机根据路由规则(如 Direct、Fanout、Topic 等类型)将消息路由到一个或多个队列中,消费者从队列中获取消息进行处理 。RabbitMQ 还引入了虚拟主机(Virtual Host)的概念,用于逻辑隔离不同的应用程序或服务,每个虚拟主机都有自己的交换机、队列、绑定和权限设置 。例如,在一个电商系统中,订单创建消息可以通过 Topic 类型的交换机,根据不同的订单类型(如普通订单、团购订单等)路由到不同的队列,供相应的消费者处理。
  • RocketMQ:RocketMQ 的架构主要由 NameServer(命名服务器)、Broker(代理)、Producer(生产者)和 Consumer(消费者)组成 。NameServer 是轻量级的服务发现和路由组件,负责维护 Broker 的注册信息、Topic 的路由信息等,Producer 和 Consumer 通过与 NameServer 交互获取 Broker 信息 。Broker 负责接收、存储和转发消息,支持同步刷盘和异步刷盘两种方式,保证消息的可靠性 。一个 RocketMQ 集群可以包含多个 Broker,每个 Broker 可以配置多个 Master 和 Slave 节点,通过主从复制实现高可用性 。例如,在阿里的电商业务中,RocketMQ 集群支撑着海量订单消息的处理,通过其高效的架构设计,确保了消息的可靠传输和快速处理。

(二)性能表现

  • 吞吐量:Kafka 以其超高的吞吐量著称,单机写入 TPS 可达百万条 / 秒级别,在大数据领域处理海量数据时优势明显 。这得益于它的分布式架构、批量处理和顺序写磁盘等优化策略,使其能够快速处理大规模的数据流 。RocketMQ 的吞吐量也非常高,单机可以达到 10 万以上的 QPS,它采用顺序写盘、零拷贝等技术,减少了磁盘 I/O 开销,提高了消息的读写速度 。RabbitMQ 的吞吐量相对较低,一般在万级左右,由于其实现机制相对较重,在高并发场景下性能表现不如 Kafka 和 RocketMQ 。
  • 延迟:RabbitMQ 的延迟最低,可达微秒级,适用于对延迟要求极高的场景,如金融交易系统中的实时消息通知 。RocketMQ 的延迟在毫秒级,通过优化存储和网络通信等方面,能够满足大多数业务对消息处理延迟的要求 。Kafka 由于采用异步批量处理的方式,延迟相对较高,不过在大数据处理等对延迟要求不是特别苛刻的场景下,其性能优势依然能够得到充分发挥 。
  • 并发性能:Kafka 和 RocketMQ 天生支持分布式,通过集群扩展能够支持大量的并发连接和消息处理 。Kafka 的分布式架构使其可以轻松应对高并发的读写请求,通过分区和副本机制实现负载均衡 。RocketMQ 通过 Broker 集群和负载均衡策略,也能很好地支持高并发场景 。RabbitMQ 采用 Erlang 语言编写,本身具有较好的并发处理能力,但在集群扩展方面相对复杂,大规模并发场景下的性能提升不如 Kafka 和 RocketMQ 。

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

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

相关文章

[创业之路-441]:行业 - 互联网+移动互联网和大数据时代的100个预言:技术个性、商业变革、社会重构、文化娱乐、环境、教育、健康医疗、未来生活方式

目录 一、技术革新 二、商业变革 三、社会重构 四、文化与娱乐 六、环境与可持续发展 七、教育与知识传播 八、健康与医疗 九、伦理与法律 十、未来生活方式 十一、终极预言 结语 在移动互联网和大数据时代,技术革新正以前所未有的速度重塑社会、经济与文…

基于STM32单片机WIFI无线APP控灯亮度灭设计

基于STM32单片机控灯设计 (程序+原理图+设计报告) 功能介绍 具体功能: 本设计由STM32F103C8T6单片机核心电路两位白色高亮LED灯电路WIFI模块ESP8266电路电源电路组成。 1、stm32实时监测wifi数据,解析数…

学会C++中的vector的基本操作

vector 是 C 标准库中的一个动态数组类,它可以在运行时自动调整大小,非常适合用于处理大小不确定的集合。下面是 vector 的常见用法示例,帮助你更好地理解如何使用它。 注意:所有用数组完成的任务都可以用vector完成。 1. 引入头…

AI时代工具:AIGC导航——AI工具集合

大家好!AIGC导航是一个汇集多种AIGC工具的平台,提供了丰富的工具和资源。 工具功能​: 该平台整合了多样的AIGC工具,涵盖了绘画创作、写作辅助以及视频制作等多个领域。绘画工具能够生成高质量的图像作品;写作工具支持从构思到润色的全流程写…

java-SpringBoot框架开发计算器网页端编程练习项目【web版】

今天分享一个使用springboot 写一个 前后端不分离的项目,网页计算器,来熟悉springboot框架的使用。 java版本:8。 springboot:2.6.13 使用的技术是: Java Spring Boot Thymeleaf HTML/CSS/JS 构建的 Web 端简约按钮…

linux操作系统的软件架构分析

一、linux操作系统的层次结构 1.内核的主要功能 1)进程管理 2)内存管理 3)文件系统 4)进程间通信、I/O系统、网络通信协议等 2.系统程序 1)系统接口函数库,比如libc 2)shell程序 3)编译器、编辑…

浅谈Java对象在内存中的存储形式

我们知道计算机以二进制的方式存储数据,以 64 位虚拟机为例,Java 对象在内存中的存储形式为: 开头是 8 个字节的 markword,用于标记对象的状态。(也就是一个 long 型数据的大小。不妨记作对象头里有一个长长的 markwo…

Android 开发问题:Wrong argument type for formatting argument ‘#2‘ in info_message

<string name"info_message">name: %1$s, age: %2$d</string>String str getString(R.string.info_message, "zs");在 Android 开发中&#xff0c;上述代码&#xff0c;出现如下警告信息 Wrong argument type for formatting argument #2 in…

Vue+spring boot前后端分离项目搭建---小白入门

首先&#xff0c;介绍一下软件准备工作 1.vscode 2.maven 3.vue搭建&#xff1a;node.jsyarnvite 一.后端搭建 打开vscode,建立一个springboot项目&#xff0c;参考链接&#xff1a;sping boot项目搭建 建立一个项目&#xff0c;目录结构如下&#xff1a; helloController.java…

“苏超”拉动周末消费,抖音生活服务:比赛城市迎来普遍消费上涨

“苏超”爆火&#xff0c;有力拉升了紧随赛程的周末消费。抖音生活服务数据显示&#xff0c;刚刚过去的周末&#xff08;6月21日至22日&#xff09;&#xff0c;江苏商圈休闲运动团购订单消费环比增长225%&#xff0c;到店消费金额环比增长181%。虽然几个比赛城市周末天气欠佳&…

使用python开发一个exe版本的计算器项目练习

最近在练习python开发软件&#xff0c;就开发了一个 客户端版的 计算器。先给大家看一下 做出来的样子 python版本&#xff1a;3.8 以上 主要是 使用 import tkinter as tk 这个库来实现图形界面开发 代码还是比较简单的&#xff1a; # 创建主窗口 root tk.Tk() root.title…

uniapp开发小程序,导出文件打开并保存,实现过程downloadFile下载,openDocument打开

uniapp开发小程序&#xff0c;导出文件打开并保存 实现思路 1、调用请求获取到后端接口返回的下载文件的url路径 &#xff08;注意必须是https的路径&#xff0c;域名需要配置在微信小程序后台的合法域名里面&#xff09; 2、使用 uni.downloadFile 方法 &#xff08;下载文件…

vue2中前端实现图片裁剪上传到服务器

在 Vue 2 中实现图片裁剪并上传到服务器&#xff0c;你可以结合使用 Cropper.js 来进行图片裁剪&#xff0c;并通过 Axios 或者其他 HTTP 客户端库将裁剪后的图片上传至服务器。以下是一个基本的实现步骤和示例代码&#xff1a; 步骤 安装依赖&#xff1a;你需要安装 cropperj…

C# 网络编程-关于HttpWebRequest使用方式(二)

项目开发用到数据请求时候&#xff0c;会用的到HttpWebRequest的请求方式&#xff0c;主要涵盖GET、POST、PUT、DELETE等方法 一、HttpWebRequest简介 HttpWebRequest是.NET Framework中用于发送HTTP请求的核心类&#xff0c;适用于构建HTTP客户端。它支持GET、POST、PUT、DE…

git变更记录

目录 wvp-ui -new Dji 10.60.2.175:8000上的编译 个人拉分支 目前约定2025-06-25 wvp-ui -new branch new BASE_URL /new/ ci-cd : wvp-newui Config [Jenkins] 禁 用 10.30.2.8 ssh 10.30.2.8 /home/dualven/wvp-server/deployNewUi.sh Dji 主分支的构建&#xf…

前端如何禁止用户复制?

禁用右键菜单 document.addEventListener(contextmenu, function(e) {e.preventDefault(); });禁用快捷键&#xff08;CtrlC/X/A等&#xff09; document.addEventListener(keydown, function(e) {if (e.ctrlKey && [c, x, v, a].includes(e.key.toLowerCase())) {e.…

阿里云无影:开启云端办公娱乐新时代

阿里云无影云电脑&#xff1a;打破传统束缚&#xff0c;畅享云端自由 在数字化浪潮汹涌澎湃的当下&#xff0c;云计算技术持续革新&#xff0c;为我们的工作与生活带来前所未有的变革。阿里云作为云计算领域的佼佼者&#xff0c;推出的无影云电脑无疑是一颗璀璨的明星&#xf…

Windows 和 macOS 串口调试软件

在 Windows 和 macOS 上&#xff0c;你可以使用以下串口调试软件来查看开发板的打印信息。以下是常见且好用的工具推荐&#xff1a; Windows 推荐工具 PuTTY 免费、轻量级&#xff0c;支持串口&#xff08;COM&#xff09;和 SSH/Telnet下载地址&#xff1a;https://www.putty.…

Redis 的作用及详细分析

网上查询总结了一下Redis相关的信息 记录一下 &#xff0c;有问题的地方&#xff0c;望多加指正&#xff0c;我们共同学习。 什么是Redis Redis是一款内存高速缓存数据库。Redis全称为&#xff1a;Remote Dictionary Server &#xff08;远程数据服务&#xff09;&#xff0c;…

【边缘计算】引论基础

&#xff08;1&#xff09;在不远的未来&#xff0c;将有超过50%的数据需要在网络边缘侧分析、处理与储存。智能互联的网络边缘侧将会面临如下挑战&#xff1a; 联接设备的海量与异构 随着联接设备数量的剧增&#xff0c;网络运维管理、灵活扩展和可靠性保障都面临着巨大挑战。…