技术选型:RocketMQ or Kafka

本文探讨了在系统间调用解耦时,选择RocketMQ还是Kafka的决策过程。文章通过比较两者的适用场景、性能、可靠性、实时性、消息顺序性、重试机制、定时消息、分布式事务和消息查询等特性,得出RocketMQ在数据可靠性、实时性和消息顺序性等方面的优势。阿里自研RocketMQ主要是由于其业务对数据正确性、实时性和复杂业务支持的高要求,以及避免开源方案的技术成本和维护问题。

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

当业务需要系统间调用解耦时,MQ 是一个很好的方案,目前选择最多的当属Kafka和阿里的RocketMQ, 两种中间件都可以使用,都是备选方案,摆在面前,怎么选择?

一. 方法论-评估和选择备选方案的方法

按优先级选择,即架构师综合当前的业务发展情况、团队人员规模和技能、业务发展预测等因素,将质量属性按照优先级排序,首先挑选满足第一优先级的,如果方案都满足,那就再看第二优先级……以此类推。

二.RocketMQ和Kafka到底有什么区别

1、适用场景

kafka适合做日志处理

rocketmq适合处理业务

2、性能

kafka单机写入TPS号称在百万条/秒

RocketMQ大约是10万/秒

3、可靠性

kafka使用异步刷盘,异步Replication

rocketmq支持异步/同步刷盘,异步/同步Replication

结论:rocketmq所支持的同步方式提升了数据的可靠性

4、实时性

均支持pull长轮询,rocketmq的实时性更好

5、支持的队列数

kafka单机超过64个队列/分区,消息发送性能降低严重

rocketmq单机支持最高5万个队列,性能稳定

结论:长远来看,rocketmq胜出,这也是适合业务处理的原因之一

6、消息顺序性

kafka某些配置下,支持消息顺序,但是一台broker宕机后,就会产生消息乱序

rocketmq支持严格的消息顺序,在顺序消息场景下,一台broker宕机后,消息发送会失败,但是不会乱序

7、消息失败重试机制

kafka消费失败不支持重试

rocketmq支持定时重试

8、定时/延时消息

kafka不支持定时消息

rocketmq都支持

9、分布式事务消息

kafka不支持

### 中间件常见面试题及相关知识点 #### 关于中间件的基础概念 中间件是一种软件组件,位于操作系统应用程序之间,用于连接不同的应用系统或服务[^1]。它提供了诸如消息传递、事务管理等功能,使得分布式系统的开发更加高效。 #### 消息队列的相关问题 以下是关于消息队列的一些常见面试题及其解答: 1. **消息队列的应用场景** - 应用解耦:通过引入消息队列,生产者消费者可以独立扩展或修改而不影响对方。 - 异步处理:允许系统在后台逐步完成耗时操作,提升用户体验。 - 流量削峰:当请求流量过大时,可以通过消息队列缓冲请求,防止下游服务崩溃[^2]。 2. **引入消息队列可能带来的问题** - 数据一致性:在网络不稳定的情况下可能导致数据丢失或重复。 - 系统复杂度增加:增加了额外的运维成本技术栈学习曲线。 - 消息延迟:某些情况下可能会导致业务逻辑无法实时响应。 3. **如何选择合适的消息队列** - 根据性能需求(吞吐量、延时)、可靠性要求(持久化能力)、功能特性(支持广播模式、死信队列等)来决定具体选型。 4. **常见的消息队列及特点** - Kafka:适合高吞吐量的日志收集与流数据分析场景;具有强大的水平扩展能力分区机制。 - RabbitMQ:基于 AMQP 协议,提供丰富的路由策略支持多种协议接入方式。 - RocketMQ:阿里巴巴开源项目,在大规模集群环境下表现出优秀的稳定性高性能表现[^2]。 5. **避免消息被重复消费的方法** - 使用幂等设计原则,即使同一条消息多次到达也不会改变最终状态。 - 设置全局唯一 ID 并记录已处理过的消息标识符列表以便去重校验。 6. **保证消息消费顺序性的方法** - 对单个主题下的多个分区只分配给固定数量的工作线程进行拉取操作。 - 如果严格要求全序,则需禁用多分区并采用单一消费者模型[^2]。 7. **预防消息堆积现象的发生** - 提升消费者的并发能力以匹配生产速率。 - 定期监控队列长度变化趋势及时调整资源配置[^2]。 #### 事务管理中的挑战与解决方案 在一个典型的分布式环境中,为了保障跨服务调用的数据一致性,通常会涉及两阶段提交 (Two-phase Commit, 2PC) 或补偿事务的设计思路[^1]。然而这些传统做法往往伴随着较高的锁开销或者回滚风险,因此现代框架更倾向于推荐柔性事务理念——即牺牲部分强一致换取更高的可用性指标。 对于像 RocketMQ 这样的产品而言,其内置了专门应对此类难题的功能模块叫做“半消息”,配合后续确认动作共同构成了完整的事务语义实现链条。 ```python from rocketmq.client import Producer, Message producer = Producer('transaction_producer') producer.set_name_server_address('localhost:9876') def create_message(): msg = Message('TopicTest') msg.set_keys('Key') msg.set_tags('TagA') msg.set_body('Hello RocketMQ') return msg try: result = producer.send(msg=create_message(), block=True) except Exception as e: # Handle exception and decide whether to commit or rollback the transaction. pass finally: producer.shutdown() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值