Kafka、RocketMQ、Pulsar全方位对比

本文详细介绍了消息队列在系统解耦、异步处理、流量削锋和消息通信等场景的应用,以Kafka和RocketMQ为例,探讨了消息中间件的重要性和选择。同时,讲解了JMS和AMQP的概念,并对比了几种主流消息队列产品,如ActiveMQ、RabbitMQ、Kafka和RocketMQ。此外,还阐述了消息队列的核心模型和通信模式,包括点对点和发布订阅模式,以及拉取和推送数据的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:随着大数据时代的到来,Apache 旗下的 Kafka 一度成为消息队列的代名词,提起消息队列大家自然而然就想到了 Kafka。然而消息队列本身是服务器端解决问题的一种通用方案,它的背后有着一些通用的设计思想和经典模型,这些是消息队列的精髓和灵魂。Kafka 和 RocketMQ 是目前最热门的两种消息中间件,Apache Plusar作为后起之秀最近也发展得不错。

一、消息队列使用的五种场景简介

MQ全称为Message Queue, 消息队列是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题,用来实现高性能,高可用,可伸缩和最终一致性架构。但是引入了MQ之后,需要考虑的问题也变得多了,如何保证消息没有重复消费?如何保证消息不丢失?怎么保证消息传递的顺序?

常见的消息队列有Kafka,RocketMQ、RabbitMQ,ActiveMQ、Plusar。目前,MQ 的应用场景非常多,大家能倒背如流的是:系统解耦、异步通信和流量削峰。除此之外,还有延迟通知、最终一致性保证、顺序消息、流式处理等等。

以下介绍消息队列在实际应用中常用的使用场景。异步处理,应用解耦,流量削锋和消息通讯四个场景


1.1、异步处理,提升效率

场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.并行方式

(1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端

(2)并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间

假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时间可能是100毫秒。

因为CPU在单位时间内处理的请求数是一定的,假设CPU1秒内吞吐量是100次。则串行方式1秒内CPU可处理的请求量是7次(1000/150)。并行方式处理的请求量是10次(1000/100)

小结:如以上案例描述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。如何解决这个问题呢?

引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:

按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因为写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。因此架构改变后,系统的吞吐量提高到每秒20 QPS。比串行提高了3倍,比并行提高了两倍

 1.2、应用解耦

场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。如下图

 传统模式的缺点:

  • 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败

  • 订单系统与库存系统耦合

如何解决以上问题呢?引入应用消息队列后的方案,如下图:

  • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功

  • 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作

  • 假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦


1.3、流量削锋

流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛

应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。

  • 可以控制活动的人数

  • 可以缓解短时间内高流量压垮应用

      

  • 用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面

  • 秒杀业务根据消息队列中的请求信息,再做后续处理


1.4、日志处理

日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题。架构简化如下

  • 日志采集客户端,负责日志数据采集,定时写受写入Kafka队列

  • Kafka消息队列,负责日志数据的接收,存储和转发

  • 日志处理应用:订阅并消费kafka队列中的日志数据

以下是新浪kafka日志处理应用案例:新浪技术分享:我们如何扛下32亿条实时日志的分析处理

(1)Kafka:接收用户日志的消息队列

(2)Logstash:做日志解析,统一成JSON输出给Elasticsearch

(3)Elasticsearch:实时日志分析服务的核心技术,一个schemaless,实时的数据存储服务,通过index组织数据,兼具强大的搜索和统计功能

(4)Kibana:基于Elasticsearch的数据可视化组件,超强的数据可视化能力是众多公司选择ELK stack的重要原因


1.5、消息通讯

消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等

点对点通讯:

客户端A和客户端B使用同一队列,进行消息通讯。

聊天室通讯:

客户端A,客户端B,客户端N订阅同一主题,进行消息发布和接收。实现类似聊天室效果。

以上实际是消息队列的两种消息模式,点对点或发布订阅模式。模型为示意图,供参考。


二、常见的消息队列中间件  

RocketMQ 和 Kafka 是目前最热门的两种消息中间件,互联网公司应用最为广泛。从 MQ 的发展历程来看,Kafka 先于 RocketMQ 诞生,并且阿里团队在实现 RocketMQ 时,充分借鉴了 Kafka 的设计思想。掌握了 Kafka 的设计原理,后面再去理解 RocketMQ 会容易很多。

2.1、JMS和AMQP简介

了解各大消息中间件前先看看这两个概念:

(1) JMS

Java消息服务(Java Message Service)即JMS,是一个Java平台中关于面向消息中间件的API,用于两个程序之间,或分布式系统中发送消息,进行异步通信。

JMS包括队列与主题两种模式,一种是点对点的Queue,还有一个是发布订阅的Topic方式。区别在于:

(1)对于Queue模式,一个发布者发布消息,下面的接收者按队列顺序接收,比如发布了10个消息,两个接收者A,B那就是A,B总共会收到10条消息,不重复。

(2)对于Topic模式,一个发布者发布消息,有两个接收者A,B来订阅,那么发布了10条消息,A,B各收到10条消息。

(2) AMQP

AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息网络协议

AMQP模型工作过程:

发布者(Publisher)发布消息(Message),经由交换机(Exchange)。

交换机根据路由规则将收到的消息分发给与该交换机绑定的队列(Queue)。

最后 AMQP 代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。

2.2、消息队列主流产品

下图根据时间线展示了不同时间点产生的消息队列产品,主要的产品有:

 这些消息队列中或多或少我们都听过一些,下面对上述几个消息队列做一个简单的介绍。

ActiveMQ:ActiveMQ 由 Apache 软件基金会基于 Java 语言开发的一个开源的消息代理,实现了JMS。

RabbitMQ:RabbitMQ 是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ 服务器是用 Erlang 语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。RabbitMQ 支持多种消息传递协议、传递确认等特性。

Kafka:Apache Kafka 是由 Apache 软件基金会开发的一个开源消息系统项目,由 Scala 写成。

Kafka 最初是由 LinkedIn 开发,并于 2011 年初开源。2012 年 10 月从 Apache Incubator 毕业。

该项目的目标是为处理实时数据提供一个统一、高通量、低等待的平台。Kafka 是一个分布式的、分区的、多复本的日志提交服务。它通过一种独一无二的设计提供了一个消息系统的功能。 

RocketMQ:Apache RocketMQ 是一个分布式消息和流媒体平台,具有低延迟、强一致、高性能和可靠性、万亿级容量和灵活的可扩展性。它有借鉴 Kafka 的设计思想,但不是 Kafka 的拷贝。 基于JMS实现。

Pulsar:Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计。支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性,被看作是云原生时代实时消息流传输、存储和计算最佳解决方案。

2.3、不同消息队列对比

图片

上图详细的展示了几种消息队列的各自功能及优缺点,首先,ActiveMQ 和 RabbitMQ 二者属于同一量级,在吞吐量上比后面三者差一个量级。

其次,支持强一致性的有 RocketMQ 和 Pulsar,在对消息一致性要求比较高的场景可以采用这些产品。

同时 Kafka 虽然会有数据丢失的风险,但其吞吐量比较高同时社区非常活跃,在大数据的绝大部分场景里,都可以采用 Kafka。

最后 Kafka、RocketMQ、Pulsar 这几款是基于磁盘存储数据的,内存加速访问。

而 ActiveMQ、RabbitMQ 采用内存存储数据,也支持数据持久化到磁盘。


三、消息队列核心模型

对于 MQ 来说,不管是 RocketMQ、Kafka 还是其他消息队列,它们的本质都是:一发一存一消费。再直白点就是一个「转发器」。生产者先将消息投递一个叫做「队列」的容器中,然后再从这个容器中取出消息,最后再转发给消费者,仅此而已。

上图是几乎所有消息队列设计的一个核心模型。对于一个消息队列而言,从数据流向的维度,可以拆解为三大部分:生产者、消息队列集群、消费者。

数据是从生产者流向消息队列集群,最终再从消息队列集群流向消费者,下面对这几个概念进行一一阐述。

生产者:生产数据的服务,通常也称为数据的输入提供方,这里的数据通常指我们的业务数据,例如推荐场景中用户对内容的点击数据、内容曝光数据、电商中的订单数据等等。

生产者通常是作为客户端的方式存在,但在支持事务消息的消息队列中,生产者也被设计为服务端,实现事务消息这一特性。

其次生产者通常会有多个,消息队列集群内部也会有多个分区队列,所以在生产者发送数据时,通常会存在负载均衡的一些策略,常见的有按 key hash、轮询、随机等方式。

其本质是一条数据,被消息队列封装后也被称为一条消息,该条消息只能发送到其消息队列集群内部的一个分区队列中。因此只需按照一定的策略从多个队列中选择一个队列即可。

消息队列集群:消息队列集群是消息队列这种组件实现中的核心,它的主要功能是存储消息、过滤消息、分发消息。其中存储消息主要指生产者生产的数据需要存储到消息队列内部;存储消息可以说是消息队列的核心,一个消息队列吞吐量的高低、性能优劣都和它的存储模型脱不开关系。

消费者:最终消息队列存储的消息会被消费者消费使用,消费者也可以看做消息队列中数据的输出方。消费者通常有两种方式从消息队列中获取数据:推送(push)数据、拉取(pull)数据。其次消费者也经常是作为客户端的角色出现在在消息队列这种组件中。


四、消息队列通信的两种模式

这里介绍一下消息队列通信的两种模式了:

4.1、 点对点模式

如上图所示,点对点模式通常是基于拉取或者轮询的消息传送模型,这个模型的特点是发送到队列的消息被一个且只有一个消费者进行处理。生产者将消息放入消息队列后,由消费者主动的去拉取消息进行消费。

点对点模型的的优点是消费者拉取消息的频率可以由自己控制。但是消息队列是否有消息需要消费,在消费者端无法感知,所以在消费者端需要额外的线程去监控。

4.2、 发布订阅模式

如上图所示,发布订阅模式是一个基于推送的消息传送模型,该模型可以有多种不同的订阅者。生产者将消息放入消息队列后,队列会将消息推送给订阅过该类消息的消费者(类似微信公众号)。

由于是消费者被动接收推送,所以无需感知消息队列是否有待消费的消息!但是consumer1、consumer2、consumer3由于机器性能不一样,所以处理消息的能力也会不一样,但消息队列却无法感知消费者消费的速度!

所以推送的速度成了发布订阅模模式的一个问题!假设三个消费者处理速度分别是8M/s、5M/s、2M/s,如果队列推送的速度为5M/s,则consumer3无法承受!如果队列推送的速度为2M/s,则consumer1、consumer2会出现资源的极大浪费!


五、消息队列获取数据的两种方案

在前面提到,消费者在从消息队列中获取数据时,主要有两种方案:

  • 等待推送数据

  • 主动拉取数据

目前的消息队列实现时,都会选择支持两种的至少一种,关于这两种方案的对比,大家可以参考下表。

图片


参考链接:

事务消息大揭秘!RocketMQ、Kafka、Pulsar全方位对比

常见的消息队列中间件介绍

消息队列经典十连问

### 回答1: RabbitMQ, Kafka, RocketMQ 是三种不同的消息队列系统,它们各有特点。 RabbitMQ是一种面向消息的中间件,支持高可用性分布式部署。 Kafka是一种高吞吐量的分布式流式数据平台,适用于实时数据处理分析。 RocketMQ是一种分布式消息系统,支持高吞吐量高可靠性。 总的来说,选择哪种系统取决于你的特定需求,如吞吐量,可靠性,实时性等。 ### 回答2: RabbitMQ、KafkaRocketMQ 都是当前比较常用的消息中间件,它们都有着优秀的可靠性、可扩展性、性能高可用性。但是它们在一些功能设计上还是有所不同的。 1. 消息传输方式 RabbitMQ 是 AMQP(Advanced Message Queuing Protocol)的实现,使用的是消息推送方式。AMQP 协议适用于面向传输层(TCP/IP)的异步通信,实现可靠的消息传输。 Kafka 是基于 publish-subscribe 模式的消息传递,使用的是 pull-based 方式。Kafka 使用了分区机制,将每个主题按照分区策略分成多个分区存储在不同的节点上,每个分区对应一个消费者组。 RocketMQ 也是基于 publish-subscribe 模式的消息传递,使用的是 push-based 方式。RocketMQ 同样支持分区机制,并且支持单播(点对点)广播两种消息模式。 2. 可靠性事务支持 RabbitMQ 是 AMQP 协议的实现,其可靠性方面比较出色,支持事务机制,能够保证消息的可靠传输。同时 RabbitMQ 支持主从镜像队列,能够确保高可用性。 Kafka 也是一个高可靠的消息系统,使用 ZooKeeper 进行协调管理,可用性好。Kafka 对消息的可靠性保证基于以分区为单位的消息复制机制。但是 Kafka 不支持事务,需要自己实现。 RocketMQ 的可靠性、事务方面都做得很好。RocketMQ 支持可靠异步传输可靠同步传输两种模式,并且支持事务消息。 3. 性能 Kafka 在性能方面表现非常出色,每秒可以处理数百万条消息。Kafka 将消息存储在磁盘上,通过批量写入、零拷贝、多线程等技术实现了非常高的性能。 RocketMQ 在性能方面也表现出色,读写效率都非常高。RocketMQ 采用的是 Zero-Copy 技术消息内存映射机制,能够极大地提高性能。 RabbitMQ 的性能不如 Kafka RocketMQ,但实现比较简单,开发维护相对容易。 4. 社区贡献生态系统 Kafka 的社区非常活跃,生态系统比较完善,能够实现很多基于 Kafka 的周边产品,如 Kafka Connect、Kafka Streams、KSQL 等。 RabbitMQ 在可插拔性高可靠性方面做得比较好。RabbitMQ 有大量的插件可以集成各种不同的业务场景,但是生态系统相对较小。 RocketMQ 的社区相对于 Kafka 来说比较年轻,但已有很多用户在生产环境中使用,并且生态系统正在逐渐完善。 综上所述,RabbitMQ、KafkaRocketMQ 都是优秀的消息中间件,用户应根据具体业务场景需求来选择适合自己的消息中间件。如果需要可靠性事务支持,可以选择 RabbitMQ RocketMQ;如果追求高性能数据的实时处理、大数据场景下的数据传输存储,可以选择 Kafka。 ### 回答3: RabbitMQ、KafkaRocketMQ都是当前非常热门的消息中间件。它们在一定程度上有相似之处,但也有很大的不同。下面就从多个维度来比较它们。 1. 引入背景 RabbitMQKafka都是在2007年左右诞生的,它们出现的时候,主要解决的是MQ的技术难题。RabbitMQ最早是由LShift公司的一群开发人员开发,主要是基于AMQP协议,用Erlang语言编写;Kafka则是由LinkedIn公司开发,最初将其用于处理LinkedIn的大量数据,后来成为了Apache的开源项目。而RocketMQ则是在2012年左右开始开发的,主要是由阿里巴巴开发,也是基于Apache RocketMQ的开源项目。 2. 架构设计 RabbitMQ的架构设计是基于AMQP协议的,采用Erlang语言实现,因此具有较高的可靠性扩展性,也有很多 plugins 可以使用。RabbitMQ 的架构包含 Exchange(交换机)、Queue(队列)、Binding(绑定) Virtual Host(虚拟主机)4个主要部分。 Kafka的架构设计则是基于Pub/Sub模式,它以专门存储消息的Topic为核心,而且Kafka只提供了一小部分的API,主要是向 Producer Consumer 暴露API,并利用 ZooKeeper 进行协调管理。 RocketMQ的架构设计是基于分布式的架构设计,通过 Name Server 管理 Topic 信息 Broker 状态,Broker 通过实现 Master-Slave 备份机制来保证高可用性。 3. 性能比较 在性能方面,Kafka相对而言,吞吐能力最强,支持每秒数百万级别的消息处理,非常适合高吞吐量且处理逻辑简单的场景。而RabbitMQRocketMQ相对而言则处理能力较低,并发高负载会导致性能下降。同时在可扩展性方面,RabbitMQ与RocketMQ相对而言更加灵活,可根据实际需求动态调整集群规模,而Kafka则稍微有些麻烦。 4. 支持性比较 在支持的消息协议方面,KafkaRocketMQ同时支持自定义协议,而RabbitMQ则主要支持AMQP协议。同时在支持的编程语言方面,Kafka支持Java、Scala、Python、.NET等语言,RocketMQ主要支持Java语言,而RabbitMQ同样支持Java、C#、JavaScript等多种编程语言。 总体来看,每个消息中间件都有自己的优势局限性,选择哪种消息中间件主要取决于实际的业务需求、架构设计数据规模等因素。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java架构何哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值