RocketMQ 与 Kafka 核心配置对比
以下从生产者、消费者、Broker、分片(分区/队列)四个维度对比两者的核心配置差异,结合典型场景说明:
一、生产者配置
RocketMQ
- 发送模式
DefaultMQProducer
:支持 同步发送(syncSend)、异步发送(asyncSend)、单向发送(sendOneWay),通过参数sendLatencyFaultEnable
控制故障转移策略。- 重试机制:默认重试次数
retryTimesWhenSendFailed=2
,可自定义超时时间sendMsgTimeout=3000ms
。
- 消息压缩
- 支持
gzip
、snappy
等压缩算法,通过compressMsgBodyOverHowmuch
设置压缩阈值(默认4KB)。
- 支持
Kafka
- 批量发送
batch.size=16384
(默认16KB):控制单个批次大小。linger.ms=0
:批次等待时间,设为0表示立即发送,增大可提升吞吐但增加延迟。
- 可靠性控制
acks=1
(默认):Leader写入成功即返回;acks=all
需所有副本确认(更高可靠性但延迟增加)。
二、消费者配置
RocketMQ
- 消费模式
- PushConsumer:长轮询模式,实时性高,通过
consumeThreadMin=20
和consumeThreadMax=64
调节并发线程数。 - PullConsumer:需手动拉取消息,灵活性高但复杂度高。
- PushConsumer:长轮询模式,实时性高,通过
- 偏移量管理
- 默认持久化到Broker,支持重置消费位点(按时间戳或偏移量)。
Kafka
- 消费组
group.id
定义消费组,同一组内消费者共享分区。enable.auto.commit=true
(默认自动提交偏移量),可设为false
手动提交。
- 分区分配策略
partition.assignment.strategy
支持Range
(默认)、RoundRobin
等策略。
三、Broker配置
RocketMQ
- 存储机制
storePathCommitLog
:CommitLog文件存储路径(默认~/store/commitlog
),单个文件1GB。flushDiskType=ASYNC_FLUSH
(默认异步刷盘),高可靠性场景可设为SYNC_FLUSH
(同步刷盘)。
- 副本与高可用
- 主从同步复制:
brokerRole=SYNC_MASTER
(同步复制),ASYNC_MASTER
(异步复制)。 - NameServer地址:通过
namesrvAddr
配置多个节点实现路由发现。
- 主从同步复制:
Kafka
- 日志存储
log.dirs
:数据存储目录,支持多路径提升IO性能。log.retention.hours=168
(默认保留7天),log.segment.bytes=1GB
控制日志分段大小。
- 副本同步
unclean.leader.election.enable=false
(禁止非ISR副本成为Leader,保证数据一致性)。num.replica.fetchers=1
控制副本同步线程数。
四、分片(分区/队列)设置
RocketMQ
- 队列(Queue)
- 通过
setWriteQueueNums(8)
设置每个Topic的队列数(类似Kafka分区),队列数影响消费并行度。 - 单个Broker默认支持约10万队列,但需根据磁盘IO和内存合理配置。
- 通过
Kafka
- 分区(Partition)
- 创建Topic时指定
num.partitions=3
(默认分区数),分区数直接影响最大消费并行度。 - 单机分区过多(如超过100)可能导致文件句柄和负载过高。
- 创建Topic时指定
五、选型与配置建议
- 高吞吐场景
- Kafka:优先增加分区数,优化
batch.size
和linger.ms
。 - RocketMQ:启用异步刷盘,增大
sendMsgTimeout
避免超时。
- Kafka:优先增加分区数,优化
- 金融级可靠性
- RocketMQ:配置
SYNC_FLUSH
+ 同步复制(主从ACK)。 - Kafka:设置
acks=all
+min.insync.replicas=2
。
- RocketMQ:配置
- 消费并行度
- Kafka:分区数需≥消费者线程数。
- RocketMQ:队列数决定并发上限,可通过
consumeThreadMax
调整线程池。
扩展阅读:更多配置细节可参考官方文档或中的源码解析。