消息队列篇--原理篇--常见消息队列总结(RabbitMQ,Kafka,ActiveMQ,RocketMQ,Pulsar)
1、RabbitMQ
特点:
- AMQP协议:RabbitMQ是基于AMQP(高级消息队列协议)构建的,支持多种消息传递模式,如发布/订阅、路由、RPC等。
- 多语言支持:支持多种编程语言的客户端库,包括Java、Python、Node.js、Go等。
- 易用性:RabbitMQ的配置和使用相对简单,适合中小规模的应用。
- 持久化与可靠性:支持消息持久化,确保消息在系统故障时不会丢失。它还提供了多种消息确认机制(如ACK),以保证消息的可靠传递。
- 灵活性:RabbitMQ提供了丰富的路由规则和交换器类型(如Direct、Fanout、Topic、Headers),可以根据不同的业务需求灵活配置消息路由。
- 社区支持:RabbitMQ由VMware开发,后来捐赠给Pivotal Software,拥有活跃的社区和良好的文档支持。
适用场景:
- 中小型应用:RabbitMQ适合处理中小规模的消息队列需求,特别是在需要复杂的消息路由和灵活的消息传递模式的场景中。
- 微服务架构:RabbitMQ常用于微服务之间的异步通信,尤其是在需要解耦服务和处理异步任务的场景中。
- 企业级应用:RabbitMQ在企业级应用中广泛使用,特别是在金融、电商等行业。
缺点:
- 性能限制:相比Kafka和Pulsar,RabbitMQ的吞吐量较低,不适合处理大规模数据流。
- 扩展性:虽然RabbitMQ支持集群,但在大规模分布式环境中,扩展性和性能可能会受到限制。
2、Kafka
特点:
- 高吞吐量:Kafka以其出色的吞吐量著称,每秒可以处理数十万条消息,特别适合处理大规模数据流。
- 低延迟:Kafka消息传递的延迟非常低,通常在几毫秒内完成,适合实时数据分析和流处理。
- 分区与副本:Kafka使用分区(Partition)和副本(Replica)机制来实现水平扩展和高可用性。每个主题可以被分割为多个分区,分区的数据分布在集群中的不同Broker上。
- 持久化与压缩:Kafka支持消息的持久化存储,并且可以通过批量发送和压缩机制提高传输效率。
- 生态系统丰富:Kafka拥有庞大的生态系统,与Hadoop、Spark、Flink等大数据工具集成紧密,适合用于日志收集、实时分析等大数据处理场景。
- ZooKeeper依赖:Kafka依赖ZooKeeper来管理集群元数据和协调选举,但正在开发KIP-500项目以摆脱对ZooKeeper的依赖。
适用场景:
- 大数据处理:Kafka适合处理海量数据流,特别是在需要实时分析、日志收集、流处理等场景中。
- 实时分析:Kafka的低延迟特性使其成为实时数据分析的理想选择,尤其是在金融、广告、物联网等领域。
- 日志收集:Kafka常用于日志收集和聚合,能够高效地处理大量的日志数据。
缺点:
- 复杂性:随着Partition数量的增加,管理和再平衡的操作可能会变得复杂。
- 消息顺序:Kafka只提供分区级别的消息顺序保证,在某些情况下可能会导致消息乱序。
3、ActiveMQ
特点:
- JMS标准:ActiveMQ是一个基于JMS(Java 消息服务)标准的消息队列系统,支持多种消息传递模式,如点对点(P2P)和发布/订阅(Pub/Sub)。
- 多协议支持:除了JMS,ActiveMQ还支持AMQP、STOMP、MQTT等多种协议,适用于不同的应用场景。
- 持久化与可靠性:ActiveMQ支持消息持久化,确保消息在系统故障时不会丢失。它还提供了多种消息确认机制(如ACK),以保证消息的可靠传递。
- 易于集成:ActiveMQ与Java生态系统紧密集成,适合Java应用程序的开发。
- 插件化架构:ActiveMQ提供了丰富的插件机制,可以根据需要扩展功能,如安全性、监控、消息过滤等。
- 社区支持:ActiveMQ由Apache软件基金会维护,拥有活跃的社区和良好的文档支持。
适用场景:
- Java应用:ActiveMQ适合Java应用程序的开发,特别是在需要与JMS兼容的场景中。
- 企业级应用:ActiveMQ在企业级应用中广泛使用,特别是在需要可靠的消息传递和复杂的集成需求的场景中。
- 小型到中型应用:ActiveMQ适合处理小型到中型的消息队列需求,特别是在需要灵活的消息传递模式和多协议支持的场景中。
缺点:
- 性能限制:相比Kafka和Pulsar,ActiveMQ的吞吐量较低,不适合处理大规模数据流。
- 扩展性:虽然ActiveMQ支持集群,但在大规模分布式环境中,扩展性和性能可能会受到限制。
4、RocketMQ
特点:
- 高性能:RocketMQ同样具备高吞吐量和低延迟的特点,尤其在处理大规模消息传递方面表现出色。
- 高可靠性:RocketMQ支持同步双写和异步刷盘两种模式,确保消息不丢失,特别是在电商等场景下表现优异。
- 顺序写入:所有消息不分主题一律顺序写入commitlog文件,这有助于提高磁盘I/O效率。
- 队列模型:RocketMQ单机支持最高5万个队列,使得它在处理大量队列时仍能保持稳定的性能。
- 功能丰富:RocketMQ提供了丰富的功能特性,如消息过滤、事务消息、延迟消息、顺序消息等。这些特性使得RocketMQ能够更灵活地满足各种业务需求。
- Java生态友好:RocketMQ主要在中国开发者社区中受到广泛关注,与阿里巴巴的其他技术栈(如Dubbo、Spring Cloud Alibaba等)有较好的集成。
适用场景:
- 电商和金融:RocketMQ适合对数据可靠性、实时性要求较高的场景,如金融交易、订单处理等。
- 大规模消息传递:RocketMQ能够处理数百万级别的消息队列,适合需要处理大量队列的场景。
- Java 生态:RocketMQ与Java技术栈紧密集成,适合已经在使用Java技术栈的企业。
缺点:
- 社区较小:相比Kafka和Pulsar,RocketMQ的社区相对较小,虽然在中国有广泛的用户基础,但在全球范围内的影响力有限。
- 运维复杂度:RocketMQ的API简单,易于集成,但由于其与阿里巴巴技术栈的紧密集成,在非阿里巴巴技术栈环境中部署和运维的复杂度可能会有所增加。
5、Pulsar
特点:
- 分层架构:Pulsar采用两层架构,分为Broker层和BookKeeper层。Broker层负责接收和发送消息,BookKeeper层则负责存储消息,并处理副本的复制和恢复。这种架构使得计算和存储可以独立扩展,降低了扩展的复杂性。
- 强一致性:Pulsar提供严格的消息顺序保证,特别是在跨多个分区的情况下。这对于需要强一致性的应用场景(如金融交易、订单处理等)非常重要。
- 多租户支持:Pulsar内置了丰富的多租户支持,包括租户、命名空间的概念,可以为不同的租户设置资源配额、访问控制等。这对于云环境和大型企业内部的复杂场景非常有用。
- 跨地域部署:Pulsar专门为跨地域部署设计,提供了强大的全球复制能力,能够轻松实现跨多个数据中心的消息传递。
- 低延迟与高吞吐量:根据一些基准测试,在相同条件下,Pulsar的吞吐量比Kafka高出40%到60%,并且平均延迟通常比Kafka低50%以上,特别是在高并发场景下表现更佳。(注:吞吐量(Throughput)指的是在单位时间内系统能够处理的工作量或数据量,是衡量系统处理能力的一个关键指标。)
- 云原生友好:Pulsar与Kubernetes等云原生技术栈集成良好,适合现代微服务架构和容器化部署。
适用场景:
- 跨地域部署:Pulsar适合需要在全球范围内分布的应用,特别是在需要跨多个数据中心的消息传递的场景中。
- 强一致性:Pulsar适合对消息顺序和一致性要求较高的应用场景,如金融交易、订单处理等。
- 多租户支持:Pulsar适合需要在同一集群中支持多个独立租户或团队的场景,特别是在云环境中。
- 云原生架构:Pulsar适合正在向云原生架构转型的企业,特别是那些已经使用容器化、微服务等现代技术栈的企业。
缺点:
- 学习曲线:Pulsar的架构比Kafka更复杂,初期的学习曲线可能较陡,尤其是对于不熟悉其设计的团队。
- 社区较小:虽然Pulsar的社区增长迅速,但它仍然相对较小,尤其是在全球范围内的影响力有限。
6、总结

Kafka、Pulsar、RabbitMQ、ActiveMQ和RocketMQ都是非常优秀的消息队列系统,选择哪一个取决于你的具体需求。Pulsar和Kafka在性能和扩展性方面表现出色,适合处理大规模数据流和实时分析;RabbitMQ和ActiveMQ更适合中小规模的应用和企业级需求;RocketMQ则在电商和金融领域表现出色,特别是在需要高可靠性和大规模消息传递的场景中。
7、如何选择
- 如果你的应用需要:
- 高吞吐量和低延迟:Kafka和Pulsar是更好的选择,特别是在处理大规模数据流和实时分析的场景中。
- 强一致性和多租户支持:Pulsar是更好的选择,特别是在需要跨多个分区的消息顺序保证和多租户支持的场景中。
- 跨地域部署:Pulsar是更好的选择,特别是在需要在全球范围内分布的应用中。
- 易用性和简单的运维:RabbitMQ和ActiveMQ是更好的选择,特别是在中小规模的应用中,或者你需要快速上手和简单配置的场景。
- Java生态友好以及电商金融领域:RocketMQ是更好的选择,特别是在你已经在使用Java技术栈的企业中。
乘风破浪会有时,直挂云帆济沧海!!!
相关文章:
消息队列篇--原理篇--常见消息队列总结(RabbitMQ,Kafka,ActiveMQ,RocketMQ,Pulsar)
1、RabbitMQ 特点: AMQP协议:RabbitMQ是基于AMQP(高级消息队列协议)构建的,支持多种消息传递模式,如发布/订阅、路由、RPC等。多语言支持:支持多种编程语言的客户端库,包括Java、P…...
nacos 配置管理、 配置热更新、 动态路由
文章目录 配置管理引入jar包添加 bootstrap.yaml 文件配置在application.yaml 中添加自定义信息nacos 配置信息 配置热更新采用第一种配置根据服务名确定配置文件根据后缀确定配置文件 动态路由DynamicRouteLoaderNacosConfigManagerRouteDefinitionWriter 路由配置 配置管理 …...
程序代码篇---Numpyassert迭代器
文章目录 前言第一部分:Numpy1. 创建数组2. 数组索引和切片3. 数组形状操作4. 数组运算5. 数学函数6. 随机数生成7. 数组排序 第二部分:assert基本语法1.condition2.error_message 示例注意事项断言的用途 第三部分:迭代器迭代器协议1.__iter…...
(笔记+作业)书生大模型实战营春节卷王班---L0G2000 Python 基础知识
学员闯关手册:https://aicarrier.feishu.cn/wiki/QtJnweAW1iFl8LkoMKGcsUS9nld 课程视频:https://www.bilibili.com/video/BV13U1VYmEUr/ 课程文档:https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/Python 关卡作业:htt…...
分布式微服务系统架构第90集:现代化金融核心系统
#1.1 深化数字化转型,核心面临新挑战 1、架构侧:无法敏捷协同数字金融经营模式转型。 2、需求侧:业务需求传导低效始终困扰金融机构。 3、开发侧:创新产品上市速度低于期望。 4、运维侧:传统面向资源型监控体系难以支撑…...
浅谈Linux 权限、压缩、进程与服务
概述 放假回家,对Linux系统的一些知识进行重新的整理,做到温故而知新,对用户权限管理、文件赋权、压缩文件、进程与服务的知识进行了一次梳理和总结。 权限管理 Linux最基础的权限是用户和文件,先了解基础的用户权限和文件权限…...
SpringBoot中Excel表的导入、导出功能的实现
文章目录 一、easyExcel简介二、Excel表的导出2.1 添加 Maven 依赖2.2 创建导出数据的实体类4. 编写导出接口5. 前端代码6. 实现效果 三、excel表的导出1. Excel表导入的整体流程1.1 配置文件存储路径 2. 前端实现2.1 文件上传组件 2.2 文件上传逻辑3. 后端实现3.1 文件上传接口…...
JavaScript前后端交互-AJAX/fetch
摘自千峰教育kerwin的js教程 AJAX 1、AJAX 的优势 不需要插件的支持,原生 js 就可以使用用户体验好(不需要刷新页面就可以更新数据)减轻服务端和带宽的负担缺点: 搜索引擎的支持度不够,因为数据都不在页面上…...
动态规划DP 背包问题 完全背包问题(题目分析+C++完整代码)
概览检索 动态规划DP 概览(点击链接跳转) 动态规划DP 背包问题 概览(点击链接跳转) 完全背包问题 原题链接 AcWiing 3. 完全背包问题 题目描述 有 N种物品和一个容量是 V的背包,每种物品都有无限件可用。 第 i种物…...
【cocos creator】【模拟经营】餐厅经营demo
下载:【cocos creator】模拟经营餐厅经营...
JavaScript系列(52)--编译优化技术详解
JavaScript编译优化技术详解 🚀 今天,让我们深入探讨JavaScript的编译优化技术。通过理解和应用这些技术,我们可以显著提升JavaScript代码的执行效率。 编译优化基础概念 🌟 💡 小知识:JavaScript引擎通常…...
【深度学习】softmax回归的从零开始实现
softmax回归的从零开始实现 (就像我们从零开始实现线性回归一样,)我们认为softmax回归也是重要的基础,因此(应该知道实现softmax回归的细节)。 本节我们将使用Fashion-MNIST数据集,并设置数据迭代器的批量大小为256。 import torch from IP…...
【Redis】set 和 zset 类型的介绍和常用命令
1. set 1.1 介绍 set 类型和 list 不同的是,存储的元素是无序的,并且元素不允许重复,Redis 除了支持集合内的增删查改操作,还支持多个集合取交集,并集,差集 1.2 常用命令 命令 介绍 时间复杂度 sadd …...
程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<3>
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 今天我们来对上一节做一些小补充,了解学习一下assert断言,指针的使用和传址调用…...
代码随想录-训练营-day16
530. 二叉搜索树的最小绝对差 - 力扣(LeetCode) /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode…...
Vue 3 中的父子组件传值:详细示例与解析
在 Vue 3 中,父子组件之间的数据传递是一个常见的需求。父组件可以通过 props 将数据传递给子组件,而子组件可以通过 defineProps 接收这些数据。本文将详细介绍父子组件传值的使用方法,并通过优化后的代码示例演示如何实现。 1. 父子组件传值…...
谈谈你所了解的AR技术吧!
深入探讨 AR 技术的原理与应用 在科技飞速发展的今天,AR(增强现实)技术已经悄然改变了我们与周围世界互动的方式。你是否曾想象过如何能够通过手机屏幕与虚拟物体进行实时互动?在这篇文章中,我们将深入探讨AR技术的原…...
神经网络的数据流动过程(张量的转换和输出)
文章目录 1、文本从输入到输出,经历了什么?2、数据流动过程是张量,如何知道张量表达的文本内容?3、词转为张量、张量转为词是唯一的吗?为什么?4、如何保证词张量的质量和合理性5、总结 🍃作者介…...
爬取鲜花网站数据
待爬取网页: 代码: import requestsfrom lxml import etree import pandas as pdfrom lxml import html import xlwturl "https://www.haohua.com/xianhua/"header {"accept":"image/avif,image/webp,image/apng,image/sv…...
vue框架技术相关概述以及前端框架整合
vue框架技术概述及前端框架整合 1 node.js 介绍:什么是node.js Node.js就是运行在服务端的JavaScript。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎。 作用 1 运行java需要安装JDK,而Node.js是JavaScript的运行环…...
深入解析 C++ 字符串处理:提取和分割的多种方法
在 C 编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时。本文将详细探讨如何使用 C 标准库中的工具(如 std::istringstream 和 std::string 的成员函数)来提取和分割字符串,并分析不同方法的适…...
数据结构 树2
文章目录 前言 一,二叉搜索树的高度 二,广度优先VS深度优先 三,广度优先的代码实现 四,深度优先代码实现 五,判断是否为二叉搜索树 六,删除一个节点 七,二叉收索树的中序后续节点 总结 …...
NeetCode刷题第19天(2025.1.31)
文章目录 099 Maximum Product Subarray 最大乘积子数组100 Word Break 断字101 Longest Increasing Subsequence 最长递增的子序列102 Maximum Product Subarray 最大乘积子数组103 Partition Equal Subset Sum 分区等于子集和104 Unique Paths 唯一路径105 Longest Common Su…...
Google Chrome-便携增强版[解压即用]
Google Chrome-便携增强版 链接:https://pan.xunlei.com/s/VOI0OyrhUx3biEbFgJyLl-Z8A1?pwdf5qa# a 特点描述 √ 无升级、便携式、绿色免安装,即可以覆盖更新又能解压使用! √ 此增强版,支持右键解压使用 √ 加入Chrome增强…...
[EAI-027] RDT-1B,目前最大的用于机器人双臂操作的机器人基础模型
Paper Card 论文标题:RDT-1B: a Diffusion Foundation Model for Bimanual Manipulation 论文作者:Songming Liu, Lingxuan Wu, Bangguo Li, Hengkai Tan, Huayu Chen, Zhengyi Wang, Ke Xu, Hang Su, Jun Zhu 论文链接:https://arxiv.org/ab…...
什么是Rust?它有什么特点?为什么要学习Rust?
什么是Rust?它有什么特点?为什么要学习Rust? 如果你是一名编程初学者,或者已经有一些编程经验但对Rust感兴趣,那么这篇文章就是为你准备的!我们将用简单易懂的语言,带你了解Rust是什么、它有什…...
[EAI-028] Diffusion-VLA,能够进行多模态推理和机器人动作预测的VLA模型
Paper Card 论文标题:Diffusion-VLA: Scaling Robot Foundation Models via Unified Diffusion and Autoregression 论文作者:Junjie Wen, Minjie Zhu, Yichen Zhu, Zhibin Tang, Jinming Li, Zhongyi Zhou, Chengmeng Li, Xiaoyu Liu, Yaxin Peng, Chao…...
AIP-134 标准方法:Update
编号134原文链接AIP-134: Standard methods: Update状态批准创建日期2019-01-24更新日期2022-06-02 REST API通常向资源URI(如 /v1/publishers/{publisher}/books/{book} )发出 PATCH 或 PUT 请求,更新资源。 面向资源设计(AIP-…...
计算机网络一点事(24)
TCP可靠传输,流量控制 可靠传输:每字节对应一个序号 累计确认:收到ack则正确接收 返回ack推迟确认(不超过0.5s) 两种ack:专门确认(只有首部无数据) 捎带确认(带数据…...
DIFY源码解析
偶然发现Github上某位大佬开源的DIFY源码注释和解析,目前还处于陆续不断更新地更新过程中,为大佬的专业和开源贡献精神点赞。先收藏链接,后续慢慢学习。 相关链接如下: DIFY源码解析...
