Apache Pulsar vs. RabbitMQ:差异与比较

Apache Pulsar 和 RabbitMQ 都是功能强大的开源消息中间件,但它们基于不同的架构原则构建,服务于不同的用例。本文旨在深入探讨它们之间的核心差异,帮助您根据具体需求做出明智的技术选型。

1

什么是 Pulsar?

Pulsar 是一个云原生的、分布式的消息和流数据平台,专为大规模、多租户和跨地域复制场景而设计。它最初由雅虎开发,现在是 Apache 软件基金会的顶级项目。Pulsar 的核心特点是其创新的分层架构,将无状态的计算层(Brokers)与有状态的持久化存储层(Apache BookKeeper)分离。这种设计使其能够独立扩展计算和存储资源,并提供诸如内置跨地域复制、分层存储和强大的多租户隔离等高级功能。Pulsar 将消息作为持久化的日志流进行处理,支持灵活的订阅模式,使其能够在一个统一的平台上同时支持传统的队列(queuing)和流(streaming)两种用例。

2

什么是 RabbitMQ?

RabbitMQ 是一个成熟且广泛使用的开源消息代理(Message Broker),它实现了高级消息队列协议(AMQP)。RabbitMQ 遵循传统的"Smart Broker / Dumb Consumer"设计,其核心架构围绕交换机(Exchanges)、队列(Queues)和绑定(Bindings)构建,提供了非常灵活和复杂的消息路由能力。它被设计为一个轻量级、可靠的中间件,用于解耦应用程序和服务,特别适用于处理后台任务、工作队列和微服务间的异步通信。默认情况下,RabbitMQ 将消息视为瞬时数据,一旦被消费者确认处理后,消息就会从队列中删除。

3

Pulsar vs. RabbitMQ:关键差异

架构

PULSAR

采用计算与存储分离的分层架构。无状态的 Broker 负责处理消息的生产和消费逻辑,而消息的持久化存储则由一个独立的 BookKeeper 集群(称为 Bookies)负责。这种设计允许计算和存储资源根据需求独立、弹性地扩展,并天然支持自动负载均衡和故障恢复。

RABBITMQ

采用紧密耦合的传统单机代理架构,计算(消息路由)和存储(消息队列)在同一个节点上进行。单个队列的性能受限于其所在节点的单个 CPU 核心,这使得水平扩展变得复杂。扩展通常需要垂直提升节点资源或采用手动分片等复杂的运维策略。

消息消费模型

**Pulsar:**Pulsar 支持多种订阅模式,使其能够灵活地适应不同场景。Pulsar 采用一个推拉结合的客户端消费模型,通过游标(cursor)跟踪每个订阅的消费进度。支持的订阅类型包括:

  • 独占(Exclusive):只允许一个消费者附加到订阅上,保证消息顺序。

  • 共享(Shared):允许多个消费者附加到同一个订阅上,消息以循环(round-robin)方式分发,适用于工作队列场景。

  • 故障转移(Failover):允许多个消费者附加,但只有一个主消费者接收消息,当主消费者断开时,其他消费者会接管。

  • 键共享(Key_Shared):根据消息的键将消息分发给固定的消费者,确保同一键的消息由同一个消费者处理。

**RabbitMQ:**主要采用推送(Push)模型,Broker 代理主动将消息发送给已连接的消费者。消费者通过确认(acknowledgment)机制告知代理消息已成功处理。这种模型在低延迟场景下表现良好,但代理需要跟踪每个消费者的状态。

消息保留

PULSAR

将消息视为持久化的、不可变的日志流。消息会根据配置的保留策略(基于时间或大小)持久化存储在 BookKeeper 中,即使在被消费后也不会立即删除。这使得 Pulsar 原生支持消息重放(replay)和流式分析。此外,Pulsar 的分层存储功能可以将旧数据自动卸载到更廉价的对象存储(如 S3)中,实现几乎无限且经济高效的数据保留。

RABBITMQ

消息是短暂的。一旦所有订阅的消费者都确认接收并处理了某条消息,该消息就会从队列中被永久删除。虽然可以将消息配置为持久化以防止代理重启时丢失,但这主要是为了保证投递的可靠性,而不是为了长期保留数据以供重放或分析。

可扩展性

PULSAR

为大规模水平扩展而设计。由于计算和存储分离,可以轻松地通过增加无状态的 Broker 节点来提升吞吐能力,或通过增加 Bookie 节点来扩展存储容量。Pulsar 通过将主题(Topic)划分为多个 Bundle,并自动在 Broker 之间进行负载均衡,从而避免了热点问题,能够支持高达百万级的主题。

RABBITMQ

水平扩展能力有限。虽然可以通过集群模式运行,但单个队列的负载无法在多个节点间自动分配。当面临高吞吐量时,通常需要进行垂直扩展(使用更强大的服务器)或通过客户端分片、一致性哈希交换机等插件手动管理队列分布,这增加了运维的复杂性。

运维复杂度与成本

PULSAR

虽然初始设置较为复杂(需要配置ZooKeeper、BookKeeper和Broker),但拥有更强的自我管理能力和自动化特性:包括,支持动态配置更改,无需重启服务;提供完善的监控指标和管理工具;支持自动负载均衡,减少人工干预;资源利用率更高,支持多租户隔离等。

RABBITMQ

初始设置简单,但运维成本随规模增长而显著上升:包括:需要专业团队24/7监控和维护集群;扩展过程需要人工干预,增加运维工作量;资源利用率低,通常需要过度配置以应对峰值流量;缺乏弹性伸缩能力,无法根据实际负载自动调整资源;可靠扩展性提升为纵向增加单机配置,这相比较横向扩容,背负成本更高,但收益受限于因扩展导致性能降低反而递减。

高可用性与分区容错性

PULSAR

采用分层架构,将计算与存储分离,通过 BookKeeper 实现数据多副本存储。Pulsar 基于 ZooKeeper 的选举机制能够在节点故障时快速恢复服务,网络分区发生时保证系统一致性。Pulsar 的三层架构(Broker、BookKeeper、ZooKeeper)使每一层都可以独立扩展和容错,即使部分节点或组件失效,系统仍能保持可用性和数据一致性。

RABBITMQ

提供镜像队列和仲裁队列两种高可用方案,但都存在明显缺陷。其中,镜像队列在网络分区场景下存在严重脑裂风险,可能导致多个独立子集群同时接受写入,网络恢复后只保留一个分区的数据,其余数据丢失。仲裁队列虽然基于Raft算法,理论上能避免脑裂,但在少数派节点会停止服务,损失过多性能。同时,由于节点间复制机制会显著降低整体吞吐量,特别是在高负载情况下表现不佳,网络分区恢复后的节点重启和队列重建过程会导致服务临时中断。整体设计比较适用于单体高性能机器部署架构。

性能和吞吐量

Pulsar:在高吞吐量场景下表现卓越。基准测试显示,Pulsar 的峰值消费者吞吐量可达 260 万条/秒,生产者速率可达 100 万条/秒,比 RabbitMQ 高出 30 倍以上。即使在处理积压消息时,其发布速率也能保持稳定,且在高主题数量下仍能维持极低的 p99 延迟。

RabbitMQ:在低吞吐量下可以实现非常低的延迟。然而,随着吞吐量的增加或队列中消息的积压,其性能会显著下降。基准测试表明,其峰值消费者吞吐量约为 4.8 万条/秒,并且在处理积压时发布速率会下降超过 50%。

使用场景

PULSAR

适用于需要高吞吐量、数据持久化、消息重放和大规模扩展的场景。其统一消息和流的能力使其成为构建事件溯源、流处理、实时数据分析以及大型多租户 SaaS 平台的理想选择。

RABBITMQ

适合传统的企业消息传递、后台任务处理(工作队列)以及需要复杂消息路由逻辑的微服务架构。当应用场景侧重于任务分发和服务的即时解耦时,RabbitMQ 是一个成熟可靠的选择。

总结

在以下场景中,Pulsar 是更优的选择:

  • **高吞吐量需求:**当您的应用需要处理每秒数十万甚至数百万条消息时。

  • **统一消息和流:**当您希望在单一平台上同时满足传统消息队列和流式数据处理的需求,避免维护两套独立的系统。

  • **数据持久化与重放:**当您需要保留消息历史以用于调试、审计、合规或重新处理时。

  • **大规模多租户:**当您需要为多个团队或客户提供一个共享的消息平台,并需要严格的资源隔离和管理策略时。

  • **跨地域部署:**当您的业务需要跨多个数据中心进行灾难恢复或数据复制时,Pulsar 的内建地理复制功能可以极大地简化运维。

在以下场景中,RabbitMQ 仍然是一个可靠的选择:

  • 简单的任务队列:对于处理后台作业、发送通知等典型的任务队列场景,RabbitMQ 成熟且易于上手。

  • 复杂的路由逻辑:当您的核心需求是利用 AMQP 提供的灵活路由能力(如主题、头交换机)来分发消息时。

  • 现有生态系统:如果您的团队已经深度集成于 AMQP 生态系统,并且对性能和扩展性的要求不高。

  • 低延迟的简单消息传递:在消息量不大、不要求持久化日志的场景下,RabbitMQ 可以提供非常快速的消息传递。

4

案例

Iterable 从 RabbitMQ 迁移到 Pulsar

Iterable 是一家领先的营销自动化平台,他们最初严重依赖 RabbitMQ 进行内部消息传递。随着业务规模的扩大,他们遇到了 RabbitMQ 的一系列瓶颈:高负载下的流控问题导致服务延迟;消息被消费后即删除,使得调试和问题排查异常困难;缺乏健壮的复制机制;以及在队列数量超过一万个时出现严重的性能问题。

为了解决这些根本性的架构限制,Iterable 最终决定迁移到 Pulsar。迁移后,他们获得了显著的收益:

  • **解决了所有性能瓶颈:**Pulsar 的架构轻松应对了他们的高负载。

  • **统一了平台:**他们能够在一个平台上同时处理原有的队列工作负载和流式数据(之前尝试使用 Kafka)。

  • **实现了数据持久化:**通过利用 Pulsar 的分层存储功能,他们能够以低成本永久保留用户行为历史,这对于分析和调试至关重要。

Iterable 的案例印证了对于那些业务已经超越了传统消息中间件能力边界的公司而言,Pulsar 提供了一条清晰的现代化升级路径。

智联招聘:从 RabbitMQ 迁移到 Pulsar

智联招聘作为中国领先的人才招聘平台,每天需要处理数百万条求职者数据和招聘信息。随着业务规模迅速扩张,他们原有的 RabbitMQ 消息系统开始面临严峻挑战:服务器资源消耗过高导致运维成本攀升;消息吞吐量受限无法满足高峰期需求;业务场景多元化需要更灵活的消费模型;以及系统可靠性不足导致服务不稳定。

面对这些挑战,智联招聘决定寻找一个更强大、更现代化的消息系统替代方案。经过全面评估,他们选择了 Pulsar 作为新一代消息平台。迁移后,他们获得了显著的业务价值:

  • **提升系统性能和可扩展性:**Pulsar的分层架构能够处理日常10亿+消息,峰值数十亿消息的流量,解决了RabbitMQ在高负载下的扩展性问题。

  • 增强系统可靠性:Pulsar通过BookKeeper提供强一致性和数据持久性,确保零数据丢失,这解决了RabbitMQ在持久性和消息回放方面的局限性。

  • 支持多样化的消费模式:Pulsar统一了队列和流处理模型,使智联招聘能够用单一平台满足工作队列和发布订阅两种使用场景,消除了维护双系统的复杂性。

  • 简化了运维管理:基于Pulsar构建的统一消息平台消除了管理多个消息技术的硬件成本和管理负担,避免了自建分布式队列服务带来的持续维护负担。

智联招聘的成功迁移案例表明,对于那些在高并发、大数据量场景下运行的企业级应用,Pulsar 能够提供卓越的性能、可靠性和灵活性,成为 RabbitMQ 的理想升级替代方案。

5

结论

总而言之,Pulsar 和 RabbitMQ 都是优秀的消息系统,但它们的设计哲学和目标场景截然不同。

RabbitMQ 是一个成熟、可靠、功能丰富的传统消息代理,非常适合传统的企业应用集成和任务队列,小规模使用。而 Pulsar 则是一个面向未来的云原生消息中间件平台,其在可扩展性、数据持久化、多租户和统一消息与流方面的架构优势,使其成为应对现代大规模、数据驱动型应用和 AI 原生应用挑战的更佳选择。

Apache Pulsar 作为一个高性能、分布式的发布-订阅消息系统,正在全球范围内获得越来越多的关注和应用。如果你对分布式系统、消息队列或流处理感兴趣,欢迎加入我们!

Github:

https://github.com/apache/pulsar

扫码加入 Pulsar 社区交流群

最佳实践

互联网

腾讯BiFang | 腾讯云 | 微信 | 腾讯 | BIGO | 360 | 滴滴 | 腾讯互娱 | 腾讯游戏 | vivo| 科大讯飞 | 新浪微博 | 金山云 | STICORP | 雅虎日本 | Nutanix Beam | 智联招聘

金融/计费

腾讯计费 | 平安证券 | 拉卡拉 | Qraft | 甜橙金融

电商

Flipkart | 谊品生鲜 | Narvar | Iterable

机器学习

腾讯Angel PowerFL | Discord

物联网

云兴科技智慧城市 | 科拓停车 | 华为云 | 清华大学能源互联网创新研究院 | 涂鸦智能

通信

江苏移动 | 移动云

教育

网易有道 | 传智教育

推荐阅读

免费可视化集群管控 | 资料合集 | 实现原理 | BookKeeper储存架构解析 | Pulsar运维 | MQ设计精要 | Pulsar vs Kafka | 从RabbitMQ 到 Pulsar | 内存使用原理 | 从Kafka到Pulsar | 跨地域复制 | Spring + Pulsar | Doris + Pulsar | SpringBoot + Pulsar

相关推荐
笨蛋少年派3 小时前
操作Hadoop时,慎用sudo
大数据·hadoop·分布式
火星资讯4 小时前
Zenlayer 推出分布式推理平台,加速 AI 创新全球落地
人工智能·分布式·科技
非极限码农12 小时前
Apache Spark 上手指南(基于 Spark 3.5.0 稳定版)
大数据·spark·apache
老葱头蒸鸡15 小时前
(2)Kafka架构原理与存储机制
分布式·架构·kafka
漫谈网络15 小时前
RabbitMQ核心机制解析
分布式·rabbitmq
weixin_445476681 天前
从“用框架”到“控系统”———架构通用能力(模块边界、分层设计、缓存策略、事务一致性、分布式思维)
分布式·缓存·架构
Mr.wangh1 天前
Redis作为分布式锁
数据库·redis·分布式
小马爱打代码1 天前
分布式锁:Redisson的公平锁
分布式
Z_z在努力1 天前
【rabbitmq 高级特性】RabbitMQ 延迟队列全面解析
分布式·rabbitmq