RocketMQ vs RabbitMQ vs Kafka - 教程

RocketMQ vs RabbitMQ vs Kafka 对比表格

特性RocketMQRabbitMQKafka
吞吐量高(10万级/秒)中低(万级/秒)极高(百万级/秒)
适用场景金融交易、订单处理、实时日志企业应用、任务队列、延迟消息日志收集、流处理、大数据管道
优点低延迟、高可靠、支持事务消息易用性强、协议丰富、支持复杂路由高吞吐、持久化、水平扩展能力强
缺点社区生态较小吞吐量有限、集群扩展性较差配置复杂、不适合低延迟场景
分布式架构支持(多主多从)支持(需插件或集群模式)原生支持(分区+副本)
消息顺序性支持(分区有序)部分支持(单队列有序)支持(分区内有序)
持久化能力支持(同步刷盘)支持(内存/磁盘)支持(高性能持久化)
协议支持自定义协议AMQP、STOMP、MQTT等自定义协议
运维复杂度中等

详细说明

吞吐量
  • RocketMQ:设计目标是高吞吐和低延迟,适合金融级场景,实际吞吐约10万级/秒。
  • RabbitMQ:基于Erlang的队列模型,吞吐量受限于ACK机制和路由复杂度,通常万级/秒。适用于企业级产品
  • Kafka:采用批处理和顺序IO,吞吐量可达百万级/秒,但实时性较弱。大型互联网用的比较多。
适用场景
  • RocketMQ:电商订单、支付交易等需要事务消息的场景。
  • RabbitMQ:企业系统集成、异步任务调度(如邮件发送)。
  • Kafka:日志聚合、流式计算(如Flink/Spark数据源)。
分布式架构
  • RocketMQ:多主多从架构,支持自动故障切换,但NameServer是单点。
  • RabbitMQ:集群模式需搭配HAProxy或镜像队列,扩展性有限。
  • Kafka:原生分布式设计,依赖ZooKeeper协调分区和副本。
典型缺点
  • RocketMQ:运维工具较少,社区支持弱于Kafka。
  • RabbitMQ:集群性能随节点增加下降明显。
  • Kafka:需要调优参数(如replica.fetch.min.bytes),资源消耗大。
代码示例(生产者对比)

RocketMQ生产者

DefaultMQProducer producer = new DefaultMQProducer("group");
producer.setNamesrvAddr("localhost:9876");
producer.start();
Message msg = new Message("Topic", "Tag", "Key", "body".getBytes());
SendResult result = producer.send(msg);

Kafka生产者

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("acks", "all");
Producer producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("topic", "value"));

RabbitMQ生产者

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class RabbitMQPublisher {
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost"); // 设置 RabbitMQ 服务器地址
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
String exchange = "exchange";
String routingKey = "routing_key";
String message = "message";
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.deliveryMode(2) // 持久化消息
.build();
channel.basicPublish(exchange, routingKey, properties, message.getBytes());
}
}
}

技术选型主要还是根据现有中间件以及业务需求等各种元素来决定的。

posted @ 2025-09-20 15:23  yxysuanfa  阅读(27)  评论(0)    收藏  举报