主流分布式消息中间件RabbitMQ、RocketMQ
分布式消息中间件在现代分布式系统中起着至关重要的作用。以下是一些主流的分布式消息中间件:
1. Apache Kafka
- 特点:高吞吐量、低延迟、持久化、水平可扩展、分布式日志系统。
- 使用场景:日志收集与处理、实时流处理、事件驱动架构、大数据集成。
- 优点:强大的扩展性和性能,适合大规模数据流处理。
- 缺点:管理复杂性较高,需要深入理解其内部机制。
2. RabbitMQ
- 特点:基于AMQP协议,多协议支持(如STOMP、MQTT)、灵活的路由、可靠性高。
- 使用场景:任务队列、实时消息传递、微服务通信、消息广播。
- 优点:易用性高、丰富的管理界面、插件支持。
- 缺点:性能在大规模高并发场景下可能受到限制。
3. Apache RocketMQ
- 特点:高吞吐量、低延迟、分布式、支持严格消息顺序性、事务消息。
- 使用场景:金融交易系统、电商订单处理、日志收集与处理。
- 优点:高性能、适合大规模分布式系统、支持消息顺序性。
- 缺点:管理和监控工具相对不够完善,需要额外配置。
4. ActiveMQ
- 特点:支持多种协议(AMQP、STOMP、MQTT)、丰富的功能特性、持久化支持。
- 使用场景:企业级应用集成、实时消息传递、任务队列。
- 优点:功能强大、灵活性高。
- 缺点:性能和扩展性在大规模场景下可能受限。
5. Amazon SQS (Simple Queue Service)
- 特点:完全托管、自动扩展、高可用性、安全、与AWS其他服务集成紧密。
- 使用场景:云端任务队列、分布式系统通信、事件驱动架构。
- 优点:无需管理基础设施、与AWS生态系统集成良好。
- 缺点:仅适用于AWS生态系统内,成本相对较高。
6. Google Pub/Sub
- 特点:完全托管、全球可用、高吞吐量、低延迟、实时流处理。
- 使用场景:实时数据分析、事件驱动架构、日志收集与处理。
- 优点:高性能、全球分布、与Google Cloud其他服务集成紧密。
- 缺点:仅适用于Google Cloud生态系统内,成本相对较高。
7. Apache Pulsar
- 特点:多租户、水平扩展、分层存储、支持流处理和批处理、Geo-replication。
- 使用场景:实时流处理、日志收集与处理、大数据集成。
- 优点:高性能、灵活的存储和计算分离、强大的扩展性。
- 缺点:生态系统和社区支持相对较新,需要更多的成熟度。
8. NATS
- 特点:轻量级、高性能、简单的API、支持JetStream持久化。
- 使用场景:微服务通信、实时消息传递、物联网(IoT)应用。
- 优点:高性能、低延迟、易于部署和使用。
- 缺点:功能特性相对较少,适合特定场景。
这些消息中间件各有优缺点,选择哪种消息中间件应根据具体的业务需求、技术栈和扩展性要求来决定。
RocketMQ 和 RabbitMQ 都是流行的消息队列系统,但它们在设计理念、架构和适用场景上有一些重要的区别。以下是它们的主要区别:
1. 设计理念和起源
- RocketMQ:
- 起源:最早由阿里巴巴开发,后来成为Apache顶级项目。
- 设计理念:针对大规模分布式系统设计,强调高吞吐量、高可靠性和分布式架构。
- RabbitMQ:
- 起源:由LShift和CohesiveFT共同开发,现在由Pivotal Software维护。
- 设计理念:基于AMQP协议设计,强调协议的标准化和易用性,适合多种应用场景。
2. 架构和性能
- RocketMQ:
- 架构:采用分布式架构,Name Server 负责管理 Broker 的路由信息,Broker 负责消息存储和转发。
- 性能:高吞吐量,适合处理大量消息和高并发场景。
- 顺序性:支持严格的消息顺序性。
- RabbitMQ:
- 架构:基于单节点或集群的模式,Broker 负责消息存储和转发。
- 性能:适合中小规模的消息传递,性能随着节点数的增加可以提高,但管理和运维复杂性增加。
- 顺序性:消息顺序性支持不如 RocketMQ 严格。
3. 消息传递协议
- RocketMQ:
- 主要基于其自定义协议,但也支持其他协议如 MQTT。
- 强调高效的消息传输和存储。
- RabbitMQ:
- 基于 AMQP 协议,还支持 STOMP、MQTT 等多种协议。
- 强调协议的标准化和互操作性。
4. 可扩展性和高可用性
- RocketMQ:
- 可扩展性:水平扩展方便,适合大规模分布式部署。
- 高可用性:通过多副本机制和分布式架构实现高可用性。
- RabbitMQ:
- 可扩展性:集群模式下可扩展,但管理复杂性增加。
- 高可用性:通过镜像队列和集群机制实现高可用性,但需要额外的配置和管理。
5. 管理和监控
- RocketMQ:
- 管理工具:提供命令行工具和简单的 Web 控制台。
- 监控:需要结合外部监控系统,如 Prometheus 和 Grafana。
- RabbitMQ:
- 管理工具:提供功能丰富的 Web 管理界面,支持队列、交换器、绑定等的管理和监控。
- 监控:内置监控功能,可以实时查看消息传递情况和系统状态。
6. 适用场景
- RocketMQ:
- 适用于需要处理大规模消息、高吞吐量和严格顺序性的场景,如金融交易、日志收集和处理、电商订单系统等。
- RabbitMQ:
- 适用于中小规模的消息传递、任务队列、实时消息传递和多协议支持的场景,如微服务通信、实时数据处理、消息广播等。
总结来说,RocketMQ 更适合大规模、高并发和高吞吐量的场景,而 RabbitMQ 则适合需要协议标准化、易用性和灵活性的中小规模应用场景。选择哪种消息队列系统应根据具体的业务需求和技术环境来决定。
Apache RocketMQ是一个分布式消息中间件,最早由阿里巴巴开发,后来成为了Apache软件基金会的顶级项目。RocketMQ主要用于高吞吐量、高可靠性的消息传递和事件驱动的应用场景。它的设计目标是支持亿级规模的消息积累和高并发的消息传递,同时保证消息的顺序性和一致性。
主要特点
1. 高吞吐量和低延迟:RocketMQ能够处理大量的消息传递请求,适用于需要高性能和低延迟的场景。
2. 高可用性和容错性:通过分布式架构和多副本机制,RocketMQ确保了消息传递的高可用性和数据的可靠性。
3. 消息顺序性:支持严格的消息顺序性,确保消息按照指定顺序到达消费者。
4. 可伸缩性:能够方便地进行水平扩展,适应业务增长的需求。
5. 多种消息类型:支持点对点、发布-订阅等多种消息传递模式,灵活适用于不同应用场景。
核心组件
1. Name Server:名称服务器,负责管理Broker的路由信息,提供客户端查询和Broker注册服务。
2. Broker:消息服务器,负责接收、存储和转发消息,通常会有多个实例以实现高可用性。
3. Producer:消息生产者,负责发送消息到Broker。
4. Consumer:消息消费者,从Broker中拉取消息进行处理。
工作原理
1. 消息发送:Producer将消息发送到Broker,Broker接收到消息后进行持久化存储。
2. 路由信息管理:Broker启动时会向Name Server注册自身信息,Name Server维护所有Broker的路由信息,Producer和Consumer通过查询Name Server获取消息路由。
3. 消息消费:Consumer从Broker中拉取消息进行消费,消费完毕后进行确认。
应用场景
- 日志收集和处理:集中收集系统日志,进行实时处理和分析。
- 电商订单系统:处理订单的创建、支付、发货等事件,保证消息的可靠传递和顺序性。
- 金融交易系统:处理高频交易数据,确保消息传递的实时性和一致性。
RocketMQ通过其高性能、高可靠性和可扩展性,成为了许多互联网公司和企业在构建消息驱动架构时的首选解决方案。
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,专为低带宽、高延迟和不可靠网络环境设计。它常用于物联网(IoT)设备之间的通信,适合需要小代码占用和低网络带宽的应用场景。
主要特点
1. 轻量级:协议非常简单,开销小,非常适合嵌入式设备和资源受限的环境。
2. 发布-订阅模型:采用发布-订阅的消息传递模型(Pub/Sub),支持多对多的消息传输方式。
3. 低带宽占用:设计时考虑到网络带宽的限制,消息头部非常小,适合低带宽环境。
4. 可靠性:提供不同的服务质量(QoS)等级,确保消息在传输过程中的可靠性。
5. 持久化会话:支持持久化会话,当客户端断开连接后,服务器会保留该会话的状态。
核心组件
1. 客户端(Client):任何使用MQTT协议发送或接收消息的设备或应用程序。客户端可以是发布者(Publisher)、订阅者(Subscriber)或两者兼具。
2. 代理(Broker):消息中间件,负责接收客户端发布的消息,并将消息转发给订阅了相应主题的客户端。
工作原理
1. 连接:客户端与Broker建立连接,通常使用TCP/IP协议。
2. 发布消息:发布者将消息发布到特定主题(Topic),Broker接收到消息后进行处理。
3. 订阅主题:订阅者向Broker订阅感兴趣的主题,Broker会将对应主题的消息转发给订阅者。
4. 消息传递:根据订阅者的订阅信息,Broker将消息转发给相应的订阅者。
5. 断开连接:客户端可以随时断开与Broker的连接,断开后Broker会根据会话持久化设置决定是否保留该会话的状态。
服务质量(QoS)等级
MQTT提供三种不同的服务质量等级:
1. QoS 0(最多一次):消息发送方仅发送一次,且不要求接收方确认。消息可能会丢失或重复。
2. QoS 1(至少一次):消息发送方保证至少发送一次,接收方需确认接收。消息可能会重复,但不会丢失。
3. QoS 2(仅一次):消息发送方和接收方通过四步握手确保消息仅传递一次,既不丢失也不重复。
应用场景
- 物联网(IoT):适用于智能家居、传感器网络、工业自动化等需要高效、低延迟通信的场景。
- 实时消息传递:例如即时通讯、移动推送通知等。
- 远程监控和控制:用于远程设备的状态监控和控制。
MQTT因其轻量级、高效和可靠的特点,成为物联网和其他需要高效消息传递的场景中的广泛应用选择。
RabbitMQ 是一个开源的消息代理软件(message broker),实现了高级消息队列协议(AMQP)。它最早由LShift和CohesiveFT共同开发,现由Pivotal Software维护。RabbitMQ通过在应用之间传递消息,解耦应用程序,提高系统的可扩展性和容错性。
主要特点
1. 多协议支持:除了AMQP,还支持STOMP、MQTT等多种消息传递协议。
2. 高可用性:通过镜像队列实现高可用性,保证消息不丢失。
3. 灵活的路由机制:支持多种路由策略,包括直接、主题、头部和扇出交换器。
4. 插件系统:丰富的插件支持,如Shovel、Federation、Management、Web-STOMP等,扩展功能灵活。
5. 管理界面:提供易用的Web管理界面,方便对队列、交换器、绑定等进行管理和监控。
核心概念
1. 生产者(Producer):发送消息的应用程序。
2. 消费者(Consumer):接收并处理消息的应用程序。
3. 队列(Queue):消息存储的容器,消费者从队列中获取消息。
4. 交换器(Exchange):接收来自生产者的消息,并根据路由规则将消息路由到队列。
5. 绑定(Binding):连接交换器和队列的规则,定义了消息的路由方式。
6. 消息(Message):要传递的内容,包括消息头(metadata)和消息体(payload)。
工作原理
1. 生产者发送消息:生产者将消息发送到交换器,消息包含路由键。
2. 交换器路由消息:交换器根据路由键和绑定规则,将消息路由到一个或多个队列。
3. 消费者接收消息:消费者从队列中获取消息并进行处理。
交换器类型
1. 直接交换器(Direct Exchange):根据消息的路由键精确匹配队列的绑定键,将消息路由到相应的队列。
2. 扇出交换器(Fanout Exchange):将消息广播到所有绑定的队列,不考虑路由键。
3. 主题交换器(Topic Exchange):根据路由键的模式匹配,将消息路由到相应的队列,适用于多层次的路由规则。
4. 头部交换器(Headers Exchange):根据消息头属性进行匹配,将消息路由到相应的队列。
应用场景
- 任务队列:用于异步处理和分布式任务调度,提高系统的响应速度和处理能力。
- 日志聚合:集中收集和处理分布式系统的日志信息,进行实时分析和监控。
- 实时数据流处理:处理实时数据,如传感器数据、金融交易数据等。
- 消息广播:在分布式系统中进行消息广播,通知多个服务或应用程序。
RabbitMQ 通过其灵活的路由机制、高可用性和多协议支持,成为构建高效、可靠、可扩展的分布式系统的重要组件。
相关文章:
主流分布式消息中间件RabbitMQ、RocketMQ
分布式消息中间件在现代分布式系统中起着至关重要的作用。以下是一些主流的分布式消息中间件: 1. Apache Kafka - 特点:高吞吐量、低延迟、持久化、水平可扩展、分布式日志系统。 - 使用场景:日志收集与处理、实时流处理、事件驱动架构、大数…...
【Unity Linux】模型导致的Unity项目崩溃
模型需勾选Strip Bones。如不勾选,则开启项目崩溃。 也可以删除有问题模型的.meta文件。 (Unity默认会自动勾选,所以不会崩溃) 或打开.meta文件,将optimizeBones的值,由0改为1。(对应面板上的…...
22222
12212...
大数据领域的常用开发语言详解
大数据开发语言主要包括以下几个,以下是它们在大数据开发领域的优缺点和应用场景的详细说明: 1. Java 优点: 跨平台性:Java的“一次编写,到处运行”的特性使得其可以轻松地运行在多个操作系统上。面向对象ÿ…...
SpringBoot设置自动跳转前端界面
一般情况下,我们的Application启动文件的内容为一行的运行代码,默认启动项目以后不会自动跳转到我们的前端页面 public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);} 这里我的可以通过设置文件的内容&#…...
vue3前端解析大数据返给的数据格式
# xxx:111111111111111\n\n## 2222:\n- 99999999。\n- 564566556。\n- ", npm install marked import {marked} from markedmarked(# xxx:111111111111111\n\n## 2222:\n- 99999999。\n- 564566556。\n-)//就可以解析成 《…...
Incremental Player Build
*未解决,仅作记录 Unity 版本 2021.3.15f1 问题 Unity 发布webgl 平台卡在Incremental Player Build 界面。 解决 未找到明确原因,简化工程路径后发布成功。...
快钱支付股东全部股权已被质押!
根据近期工商信息,第三方支付机构快钱支付清算信息有限公司(简称“快钱支付”)实际控股方快钱金融服务(上海)有限公司(简称“快钱金融”),作为出质股权标的企业,被出质给…...
【鸿蒙学习笔记】数据类型
官方文档:ArkTS语言介绍 目录标题 声明变量声明常量数据类型 缺:byte charNumber类型 short int long float doubleBoolean类型 booleanString类型Void类型Object类型Array类型Enum类型Union类型Aliases类型 [代码总结] 声明变量 let hi: string hel…...
SAP实现特别总账的凭证预制
SAP实现特别总账的凭证预制 仔细理解只有”其他”的特殊总帐标识才可预制凭证这句话. F-29/f-48不可预制。F-29/f-48预制时出现错误消息号 FP 030,提示特殊总帐标志类型“汇票和”预付定金“的特别总帐标志的过帐代码不能预制,这是系统写死的ÿ…...
鸿蒙 HarmonyOs 动画效果 快速入门
一、理论 1.1 animation属性 名称参数类型必填描述durationnumber否设置动画时长,默认值:1000,单位:毫秒temponumber否动画播放速度。数值越大,速度越快,默认为1curvestring | Curve否 设置动画曲线。 默…...
PyTorch学习之 torch.squeeze 函数
PyTorch学习之 torch.squeeze 函数 一、功能 torch.squeeze 的主要作用是从给定的张量 input 中移除所有尺寸为1的维度。 二、基本语法 torch.squeeze(input, dimNone)三、参数说明 input (Tensor): 输入的张量。dim (int, 可选): 指定要移除的尺寸为1的维度 如果未指定&am…...
达梦数据库系列—17. 主备集群搭建-实时主备
目录 配置实时主备 1、环境说明 2、数据准备 脱机备份、脱机还原方式 联机备份、脱机还原方式 3、配置主库 3.1 配置 dm.ini 3.2 配置 dmmal.ini 3.3 配置 dmarch.ini 3.4 配置 dmwatcher.ini 3.5 启动主库为mount 3.6 设置 OGUID 3.7 修改数据库模式 4、配置备库…...
【24医学顶刊】GANDALF:主动学习 + 图注意力变换器 + 变分自编码器,改善多标签图像分类
GANDALF:主动学习 图注意力变换器 变分自编码器,改善多标签图像分类 提出背景子解法1:多标签信息样本的选择子解法2:生成信息丰富且非冗余的合成样本 例子:胸部X射线图像分析传统方法的操作和局限GaNDLF方法的优势 工…...
Linux 权限介绍
文章目录 Linux 权限介绍权限类型权限的数字表示查看文件信息修改权限相关指令 Linux 权限介绍 在 Linux 系统中,权限管理是非常重要的一部分,它确保了系统的安全性和文件的合理访问。 权限类型 [ r ]代表可读(read)࿱…...
kernel header解析
一、kernel header定义: aarch64 kernel header u32 code0; /* Executable code */ u32 code1; /* Executable code */ u64 text_offset; /* Image load offset, little endian */ u64 image_size; /* Effective Image size, little…...
MQ运行时遇到的问题
遇到的问题描述:我在绑定通道的时候发现了通道绑定失败, 原因: 在代码中我第一次创建交换机的时候类型的默认没有修改成topic类型的,导致后面的代码再去进行注册的时候并没有实现那个类型 解决: 更改代码࿰…...
EDI是什么?与ERP有何关系
EDI的发展过程 电子数据交换(Electronic Data Interchange,EDI)是一种通过电子方式传输商业文件的技术。EDI的历史可以追溯到20世纪60年代,当时企业开始使用计算机进行数据处理。最早的EDI系统是为解决大型企业间的信息交换问题而…...
【MotionCap】在wsl2 ubuntu20.04构建及运行
https://github.com/MVIG-SJTU/AlphaPose/issues/1157conda create -n alphapose python=3.7 -y conda activate alphapose conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1...
iptables 防火墙(二)
iptables 防火墙(二) 一、SNAT 策略及应用SNAT 策略概述SNAT 策略的应用 二、DNAT 策略及应用DNAT 策略概述 三、规则的导出、导入规则的备份及还原iptables-save 命令iptables-restore 命令 使用 iptables 服务 四、使用防火墙脚本防火墙脚本的构成防火…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
