RabbitMQ 和 RocketMQ,哪个更好?

发布时间:2026/6/4 9:04:56

RabbitMQ 和 RocketMQ,哪个更好? 这是一个或许对你有用的社群 一对一交流/面试小册/简历优化/求职解惑欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料《项目实战视频》从书中学往事上“练”《互联网高频面试题》面朝简历学习春暖花开《架构 x 系统设计》摧枯拉朽掌控面试高频场景题《精进 Java 学习指南》系统学习互联网主流技术栈《必读 Java 源码专栏》知其然知其所以然这是一个或许对你有用的开源项目国产Star破10w的开源项目前端包括管理后台、微信小程序后端支持单体、微服务架构RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRM、AI大模型、IoT物联网等功能多模块https://gitee.com/zhijiantianya/ruoyi-vue-pro微服务https://gitee.com/zhijiantianya/yudao-cloud视频教程https://doc.iocoder.cn【国内首批】支持 JDK17/21SpringBoot3、JDK8/11Spring Boot2双版本来源苏三说技术前言一、为什么需要消息队列二、核心特性对比三、RabbitMQ解析3.1 RabbitMQ的核心优势3.2 RabbitMQ的局限性3.3 RabbitMQ适用场景四、RocketMQ解析4.1 RocketMQ的核心优势4.2 RocketMQ的局限性4.3 RocketMQ适用场景五、如何选型5.1 决策树5.2 关键决策因素5.3 混合架构方案总结前言最近有球友问我苏三哥现在一般项目中的消息中间件是用RabbitMQ还是RocketMQ会更好一些这是一个非常常见的问题。今天这篇文章就专门跟大家一起聊聊这个话题希望对你会有所帮助。基于 Spring Boot MyBatis Plus Vue Element 实现的后台管理系统 用户小程序支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能项目地址https://github.com/YunaiV/ruoyi-vue-pro视频教程https://doc.iocoder.cn/video/一、为什么需要消息队列有些小伙伴在工作中可能已经用过消息队列但未必清楚它的核心价值。让我们先通过一个简单的场景来理解没有消息队列的系统RestController publicclass OrderController{ Autowired private InventoryService inventoryService; Autowired private PromotionService promotionService; Autowired private LogService logService; PostMapping(/order) public Result createOrder(RequestBody OrderRequest request){ // 串行调用多个服务用户需要等待所有操作完成 inventoryService.deductStock(request.getProductId(), request.getQuantity()); promotionService.updatePromotionUsage(request.getUserId(), request.getPromotionId()); logService.recordOrderLog(request); return Result.success(下单成功); } }引入消息队列后RestController publicclass OrderController{ Autowired private OrderService orderService; Autowired private RocketMQTemplate rocketMQTemplate; PostMapping(/order) public Result createOrder(RequestBody OrderRequest request){ // 1. 保存订单主记录核心业务 Order order orderService.saveOrder(request); // 2. 发送消息异步处理非核心业务 OrderCreatedEvent event new OrderCreatedEvent(order); rocketMQTemplate.send(order-topic, event); // 3. 立即返回成功 return Result.success(订单创建成功处理中); } } // 消费者异步处理 Component RocketMQMessageListener(topic order-topic, consumerGroup order-group) publicclass OrderConsumer implements RocketMQListenerOrderCreatedEvent { Override public void onMessage(OrderCreatedEvent event){ // 并行执行多个操作但用户无需等待 inventoryService.deductStock(event.getProductId(), event.getQuantity()); promotionService.updatePromotionUsage(event.getUserId(), event.getPromotionId()); logService.recordOrderLog(event); } }消息队列的核心价值在于解耦、异步、削峰。但不同的消息队列在实现这些价值时侧重点各不相同。比如异步海量数据导出功能、WebSocket消息实时通信功能、商品秒杀功能、订单超时自动取消功能等等。基于 Spring Cloud Alibaba Gateway Nacos RocketMQ Vue Element 实现的后台管理系统 用户小程序支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能项目地址https://github.com/YunaiV/yudao-cloud视频教程https://doc.iocoder.cn/video/二、核心特性对比让我们先通过一个表格直观感受两者的核心差异对比维度RabbitMQRocketMQ吞吐量(TPS)5-10K50K延迟(ms)50-10020-50协议支持AMQP、MQTT、STOMP等7种协议自定义TCP协议为主路由机制4种Exchange灵活路由Topic模型相对简单事务消息不支持支持定时/延时消息插件支持原生支持秒级精度顺序消息单队列保证全局/分区顺序支持开发语言ErlangJava社区活跃度极高生态丰富较高阿里生态为主三、RabbitMQ解析3.1 RabbitMQ的核心优势有些小伙伴可能对RabbitMQ的灵活路由机制印象深刻。确实这是RabbitMQ最强大的特性之一。RabbitMQ的四种交换机类型代码示例Topic交换机实现复杂路由// RabbitMQ配置类 Configuration publicclass RabbitMQConfig { Bean public TopicExchange orderExchange(){ returnnew TopicExchange(order.exchange); } Bean public Queue paymentQueue(){ return QueueBuilder.durable(payment.queue).build(); } Bean public Queue inventoryQueue(){ return QueueBuilder.durable(inventory.queue).build(); } Bean public Binding paymentBinding(){ return BindingBuilder.bind(paymentQueue()) .to(orderExchange()) .with(order.payment.*); } Bean public Binding inventoryBinding(){ return BindingBuilder.bind(inventoryQueue()) .to(orderExchange()) .with(order.inventory.*); } } // 生产者 Service publicclass OrderProducer{ Autowired private RabbitTemplate rabbitTemplate; public void sendOrderEvent(String eventType, OrderEvent event){ // routingKey可以是 order.payment.success 或 order.inventory.update rabbitTemplate.convertAndSend(order.exchange, order. eventType, event); } } // 消费者 - 支付服务 Component RabbitListener(queues payment.queue) publicclass PaymentConsumer{ RabbitHandler public void handlePayment(OrderEvent event){ System.out.println(支付服务处理 event); } } // 消费者 - 库存服务 Component RabbitListener(queues inventory.queue) publicclass InventoryConsumer{ RabbitHandler public void handleInventory(OrderEvent event){ System.out.println(库存服务处理 event); } }RabbitMQ的另一个优势是多协议支持。它原生支持AMQP 0-9-1、AMQP 1.0、MQTT、STOMP等多种协议这在物联网、移动端等异构系统集成时非常有用。3.2 RabbitMQ的局限性虽然RabbitMQ灵活易用但它也存在一些明显的短板性能瓶颈单节点吞吐量约5-10K TPS在百万级消息/秒场景下Erlang虚拟机可能成为性能瓶颈。集群扩展复杂依赖镜像队列实现高可用增加存储开销网络分区处理较为复杂。顺序消息困难默认不保证跨消费者的消息顺序。事务机制不完善RabbitMQ的事务机制会极大影响性能官方也不推荐使用。3.3 RabbitMQ适用场景推荐使用场景中小规模微服务系统消息量10万级/秒需要复杂路由逻辑的业务如订单状态变更通知多协议接入场景IoT设备、移动端、WebSocket对可靠性要求高于性能的企业级应用不推荐场景超大规模日志处理首选Kafka严格顺序要求的金融交易考虑RocketMQ极低延迟需求的高频交易场景四、RocketMQ解析4.1 RocketMQ的核心优势RocketMQ是阿里巴巴开源的分布式消息中间件在电商、金融等大规模分布式系统中表现优异。RocketMQ的高可用架构RocketMQ的核心特性代码示例1. 事务消息RocketMQ的王牌特性Component publicclass TransactionOrderService{ Autowired private RocketMQTemplate rocketMQTemplate; Autowired private OrderMapper orderMapper; // 发送事务消息 public void createOrderWithTransaction(OrderRequest request){ OrderMessage orderMessage new OrderMessage(request); TransactionSendResult result rocketMQTemplate.sendMessageInTransaction( order-tx-group, order-topic, MessageBuilder.withPayload(orderMessage).build(), request // 传递给本地事务执行器的参数 ); if (result.getLocalTransactionState() LocalTransactionState.COMMIT_MESSAGE) { System.out.println(事务提交成功); } } // 本地事务执行器 RocketMQTransactionListener(txProducerGroup order-tx-group) publicclass OrderTransactionListener implements RocketMQLocalTransactionListener{ Override public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg){ OrderRequest request (OrderRequest) arg; try { // 1. 执行本地事务 - 保存订单 orderMapper.insert(request); // 2. 返回提交状态 return RocketMQLocalTransactionState.COMMIT; } catch (Exception e) { // 3. 异常时回滚 return RocketMQLocalTransactionState.ROLLBACK; } } Override public RocketMQLocalTransactionState checkLocalTransaction(Message msg){ // 事务回查 - 解决分布式事务的最终一致性 OrderMessage orderMessage (OrderMessage) msg.getPayload(); // 查询本地事务是否成功 Order order orderMapper.selectById(orderMessage.getOrderId()); if (order ! null) { return RocketMQLocalTransactionState.COMMIT; } else { return RocketMQLocalTransactionState.ROLLBACK; } } } }2. 精确到秒级的定时消息RocketMQ 5.x版本引入了秒级定时消息这是通过时间轮算法实现的Service publicclass DelayMessageService{ Autowired private RocketMQTemplate rocketMQTemplate; // 发送定时消息精确到秒 public void sendDelayMessage(MessageData data, long delaySeconds){ long delayTimestamp System.currentTimeMillis() delaySeconds * 1000; MessageMessageData message MessageBuilder.withPayload(data) .setHeader(DELAY_TIME, delayTimestamp) .build(); rocketMQTemplate.syncSend(delay-topic, message); } // 消费定时消息 Service RocketMQMessageListener(topic delay-topic, consumerGroup delay-group) publicclass DelayMessageConsumer implements RocketMQListenerMessageData { Override public void onMessage(MessageData message){ System.out.println(定时消息到达 message); } } }RocketMQ的定时消息底层通过时间轮TimerWheel TimerLog实现这种设计保证了即使消息延迟时间很长如半个月也不会丢失。3. 顺序消息实现Service publicclass OrderlyMessageService{ Autowired private RocketMQTemplate rocketMQTemplate; // 发送顺序消息 - 按订单ID路由 public void sendOrderlyMessage(String orderId, OrderEvent event){ // 通过MessageQueueSelector将同一订单的消息发送到同一个队列 rocketMQTemplate.syncSendOrderly( order-topic, event, orderId // 选择key ); } // 顺序消费 Service RocketMQMessageListener( topic order-topic, consumerGroup orderly-group, consumeMode ConsumeMode.ORDERLY // 顺序消费模式 ) publicclass OrderlyConsumer implements RocketMQListenerOrderEvent { Override public void onMessage(OrderEvent event){ // 保证同一订单的消息串行处理 System.out.println(顺序处理订单事件 event); } } }4.2 RocketMQ的局限性协议封闭主要支持自定义TCP协议多语言客户端支持较弱社区生态相比RabbitMQ生态规模较小主要在阿里生态中活跃学习曲线概念较多NameServer、Broker、Queue等入门门槛略高运维复杂度需要部署NameServer和Broker集群运维成本相对较高4.3 RocketMQ适用场景推荐使用场景电商交易系统订单、支付、库存金融核心系统需要事务一致性大规模分布式系统消息量10万级/秒需要严格顺序消息的业务如交易流水需要定时/延时消息的场景不推荐场景多协议接入需求首选RabbitMQ简单的内部系统Kafka或RabbitMQ更轻量非Java技术栈为主的项目五、如何选型5.1 决策树5.2 关键决策因素选择RabbitMQ当需要复杂消息路由Topic、Direct、Fanout等需要支持多种协议MQTT、AMQP、STOMP团队熟悉Erlang或对运维复杂度敏感消息量适中10万TPS选择RocketMQ当需要分布式事务支持需要严格顺序消息需要精准定时/延时消息系统规模较大10万TPSJava技术栈为主5.3 混合架构方案在实际项目中完全可以采用混合架构架构方案 -主干消息:RocketMQ 用途:核心交易、订单、支付 理由:事务保证、高吞吐 -分支消息:RabbitMQ 用途:通知推送、日志收集、IoT设备 理由:多协议支持、灵活路由 -监控体系: -PrometheusGrafana -队列积压监控 -消费延迟告警总结通过本文我们可以得出以下结论RabbitMQ胜在灵活性和协议兼容性适合企业级应用集成、复杂路由场景。RocketMQ胜在功能全面和性能优势特别适合电商、金融等需要事务保证和顺序消息的场景。没有绝对的优劣只有最适合的选择。选择消息队列时需要综合考虑业务需求事务、顺序、定时性能要求吞吐量、延迟技术栈Java/非Java运维能力关注技术演进RocketMQ 5.x在定时消息、高可用等方面持续创新RabbitMQ也在引入Quorum Queues等增强一致性。建议每18个月重新评估技术栈。最后送给大家一句话选型不是终点理解才是关键。只有深入理解消息队列的原理才能在遇到问题时游刃有余。欢迎加入我的知识星球全面提升技术能力。 加入方式“长按”或“扫描”下方二维码噢星球的内容包括项目实战、面试招聘、源码解析、学习路线。文章有帮助的话在看转发吧。 谢谢支持哟 (*^__^*

相关新闻