消息队列选型:Kafka vs RabbitMQ vs RocketMQ

Mei Lin | 2026-08-26T23:02:40 | DevOps, Database

从吞吐量、延迟、消息可靠性、运维复杂度等维度对比三大主流消息队列,给出不同场景的选型建议。

# 消息队列选型:Kafka vs RabbitMQ vs RocketMQ ## 核心特性对比 | 特性 | Kafka | RabbitMQ | RocketMQ | |------|-------|----------|----------| | 吞吐量 | 百万级/秒 | 万级/秒 | 十万级/秒 | | 延迟 | 毫秒级 | 微秒级 | 毫秒级 | | 消息模型 | Pull | Push/Pull | Pull | | 消息回溯 | 支持 | 不支持 | 支持 | | 事务消息 | 支持 | 不支持 | 支持 | | 延迟消息 | 不原生支持 | TTL + 死信 | 原生支持 | ## Kafka:大数据管道首选 ```java // 生产者 Properties props = new Properties(); props.put("bootstrap.servers", "kafka:9092"); props.put("key.serializer", StringSerializer.class.getName()); props.put("value.serializer", StringSerializer.class.getName()); props.put("acks", "all"); // 最强可靠性 KafkaProducer producer = new KafkaProducer(props); producer.send(new ProducerRecord("user-events", userId, eventJson), (metadata, exception) -> { if (exception != null) { log.error("发送失败", exception); } }); ``` 适用:日志收集、流处理、事件溯源、大数据管道。 ## RabbitMQ:灵活路由首选 ```java // 声明交换机和队列 channel.exchangeDeclare("order.exchange", "topic", true); channel.queueDeclare("order.created", true, false, false, null); channel.queueBind("order.created", "order.exchange", "order.created.*"); // 发送消息 channel.basicPublish("order.exchange", "order.created.vip", MessageProperties.PERSISTENT_TEXT_PLAIN, messageBytes); // 消费消息(手动确认) channel.basicConsume("order.created", false, (tag, delivery) -> { try { processOrder(delivery.getBody()); channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); } catch (Exception e) { channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, true); } }, tag -> {}); ``` 适用:任务队列、RPC、复杂路由、中小规模系统。 ## RocketMQ:电商事务首选 ```java // 事务消息 TransactionMQProducer producer = new TransactionMQProducer("tx-group"); producer.setTransactionListener(new TransactionListener() { @Override public LocalTransactionState executeLocalTransaction(Message msg, Object arg) { try { orderService.createOrder(msg); return LocalTransactionState.COMMIT_MESSAGE; } catch (Exception e) { return LocalTransactionState.ROLLBACK_MESSAGE; } } @Override public LocalTransactionState checkLocalTransaction(MessageExt msg) { // 回查本地事务状态 boolean exists = orderService.existsOrder(msg.getKeys()); return exists ? LocalTransactionState.COMMIT_MESSAGE : LocalTransactionState.ROLLBACK_MESSAGE; } }); ``` 适用:电商交易、金融业务、需要事务消息和延迟消息的场景。 ## 选型建议 1. **数据管道/日志** -> Kafka 2. **微服务解耦/任务队列** -> RabbitMQ 3. **电商交易/金融** -> RocketMQ 4. **团队已有技术栈** -> 优先选择团队熟悉的

← Back to Blog