各消息队列对比

Kafka 起初是由 LinkedIn 公司采用 Scala 语言开发的一个分布式、多分区、多副本且基于 zookeeper 协调的分布式消息系统,现已捐献给 Apache 基金会。它是一种高吞吐量的分布式发布订阅消息系统,以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如 ClouderaApache StormSparkFlink 等都支持与 Kafka 集成,号称一半以上世界500强都是它的客户

RocketMQ 是阿里开源的消息中间件,目前已经捐献个 Apache 基金会,它是由 Java 语言开发的,具备高吞吐量、高可用性、适合大规模分布式系统应用等特点,积极在Cloud-Native领域发力。

RabbitMQ 是采用 Erlang 语言实现的 AMQP 协议的消息中间件,最初起源于金融系统,用于在分布式系统中存储转发消息。

ActiveMQApache 出品的、采用 Java 语言编写的完全基于 JMS1.1 规范的面向消息的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。不过由于历史原因包袱太重,目前市场份额较小,其最新架构被命名为 Apollo,号称下一代 ActiveMQ

ZeroMQ 号称史上最快的消息队列,基于 C 语言开发。ZeroMQ 是一个消息处理队列库,可在多线程、多内核和主机之间弹性伸缩,虽然大多数时候我们习惯将其归入消息队列家族之中,但是其和前面的几款有着本质的区别,ZeroMQ 本身就不是一个消息队列服务器,更像是一组底层网络通讯库

 

功能性

Kafka

rabbitmq

zeromq

rocketmq

activemq

资料文档

丰富

丰富

较多

开发语言

Scala

Erlang

c

java

java

协议支持

私有(TCP)

AMQP

TCPUDP

私有

OpenWireSTOMPRESTXMPPAMQP

存储

内存、磁盘、数据库,支持大量堆积

内存、磁盘。支持少量堆积

消息发送端的内存或者磁盘中。不支持持久化

磁盘。支持大量堆积

内存、磁盘、数据库。支持少量堆积

事务支持

支持

支持

不支持

支持

 

支持

 

负载均衡

支持(分区单位)

支持不好

去中心化,不支持负载均衡

支持

支持

集群

Leader-Slave’无状态集群

简单集群,“主-备“

不支持集群

多对‘Master-Slave’ 模式,开源版本不支持自动

简单集群,“主-备“

管理界面

一般

一般

可用性

非常高(分布式)

高(主-从)

非常高(分布式)

高(主-从)

消息语义

at least onceat most once

at least onceat most once

重传机制

at least once

at least once

TPS

极大

比较大

极大

比较大

订阅方式

Topic为单位的订阅/发布

direct, topic ,Headersfanout

p2p

topic/messageTag正则匹配

点对点(p2p)、广播(发布-订阅)

顺序消息

支持

不支持

不支持

支持

不支持

消息确认

支持

支持

支持

支持

支持

消息回溯

支持按分区offset

不支持

不支持

支持按时间点

不支持

并发度

高(分区数量+消费者数量)

极高,Erlang语言

容灾

不支持,单独组件

不支持

不支持

不支持

不支持

加密

TLS/SSLSASL身份认证和权限控制

TLS/SSL

不确认

TLS/SSL

TLS/SSL

死信队列

不支持,业务通过connect实现

不支持

不支持

不支持

不支持

小型化

默认最少三台

不确认

不确认

 

不确认

 

不确认

 

流控

客户端、用户二种方式流控

内存、磁盘、积压三个维度进行流控

不支持

消费延时流控

生产者流控未落盘的数据量,默认1M

消费者未确认的消息数量

降级

调用链

不支持

不支持

不支持

不支持(商业版支持)

不确认

### 特性与适用场景对比 #### 1. 架构设计 Kafka 是一个分布式流处理平台,采用分区副本机制,适合处理高吞吐量数据流[^1]。RabbitMQ 是一个通用的消息队列服务,基于 AMQP 协议,采用生产者-队列-消费者模型,支持复杂的路由转发功能。ActiveMQ 是一个基于 JMS 的消息队列服务,支持多种消息传输协议,并提供丰富的企业级功能。 #### 2. 协议支持 Kafka 主要使用自定义协议,支持 TCP HTTP 协议。RabbitMQ 支持多种消息传输协议,包括 AMQP、MQTT、STOMP 等。ActiveMQ 同样支持多种协议,如 AMQP、MQTT、OpenWire STOMP 等。 #### 3. 性能 Kafka 在高吞吐量低延迟方面表现出色,适合处理大量高速数据流[^1]。RabbitMQ 在中小型应用中表现良好,特别是在需要复杂的消息路由灵活的消息传递模式的场景中[^3]。ActiveMQ 在企业级应用中广泛使用,特别是在金融、电商等行业[^3]。 #### 4. 可扩展性 Kafka 的可扩展性非常强,可以通过增加分区副本轻松扩展集群。RabbitMQ 的扩展性相对较弱,但在微服务架构中常用于异步通信解耦服务[^3]。ActiveMQ 的扩展性介于 Kafka RabbitMQ 之间,支持多种消息传输协议企业级功能[^1]。 #### 5. 适用场景 Kafka 适用于需要处理大量数据流的场景,如实时数据分析、日志聚合事件溯源[^1]。RabbitMQ 适合处理中小规模的消息队列需求,特别是在需要复杂的消息路由灵活的消息传递模式的场景中。ActiveMQ 适用于企业级应用,特别是在需要支持多种消息传输协议企业级功能的场景中[^1]。 #### 6. 代码示例 以下是一个简单的 Kafka 生产者示例: ```java Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); Producer<String, String> producer = new KafkaProducer<>(props); ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key", "value"); producer.send(record); producer.close(); ``` 以下是一个简单的 RabbitMQ 生产者示例: ```java ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare("hello", false, false, false, null); String message = "Hello World!"; channel.basicPublish("", "hello", null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'"); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值