KAFKA 和 RocketMQ 的不同点

 KafkaRocketMQ备注
编程语言ScalarJava 
底层通信模块JDK NIONetty 
组件间通信用自定义基于TCP的二进制协议组件间通信用自定义RemotingCommand协议 
服务管理zookeeperNameserver

Nameserver 组件相关数据都放在内存中(kafka存储在磁盘中),无选举机制,Master挂了,只能手动吧 Slave转换成Master

 

Nameserver  各个实例之间无交互,其他角色同时向多个实例发状态信息

概念Brocker代表一个服务器的物理机Brocker是一个逻辑概念,Master Slave代表物理机 
PartitionMessageQueue

读队列数量和写队列数量可以不一致:当我们使用updateTopic命令创建topic时,会发现新建的topic下会有默认的8个写对列和8个读对列(依赖于配置),并且读队列的数量和写队列的数量还可以不一致,这是为什么呢?难道在底层读写队列是在物理上分离的吗?抱着这个问题,我分析了相关的源代码,发现底层代码对于读写队列指的都是同一个队列,其中写队列的数量是针对的producer,读队列的数量针对的是consumer:

           a.假设写队列有8个、读队列有4个,那么producer产生的消息会按轮训的方式写入到8个队列中,但是consumer却只能消费前4个队列,只有把读队列重新设置为8后,consumer可以继续消费后4个队列的历史消息;

           b.假设写队列有4个、读队列有8个,那么producer产生的消息会按轮训的方式写入到4个队列中,但是consumer却能消费8个队列,只是后4个队列没有消息可以消费罢了。

数据读写异步刷盘同步/异步刷盘 
 异步复制同步/异步复制 
 Partition leader负责读写,Partition Slave只负责同步Master负责读写,Slave只能读如果RocketMQ一个topic只有一个Master,这个Master挂掉后,消息不能够写到服务器
数据存储topic_patition 文件夹,每个数据文件 对应一个index文件

commitlog:所有topic数据都存入一个commitlog文件中,文件最大1G,追加写

comsumequeue:commitlog的索引,主要存messagequeue 对应的 offset,供commumer消费使用

indexfile:索引文件 可以通过key查找到所有包含这个key的message,主要用于数据搜索

 
producer发送数据方式同步/异步同步/异步/oneway 
消费模式

多个Consumer放在同一个Group(集群)

多个Consumer每一个放单独的Group(广播)

Consumer都放到一个Group里面,通过设置参数来确定是 广播 还是集群模式 
 pull模式push/pull 模式RocketMQ push 实际是轮询的pull
Consumer Offset 提交策略

1、自动提交(poll()方法中提交,判断距上次提交是否超过5s,超过就提交,提交最新获取到的offset。所以部分数据可能还没有消费)

2、手动提交(参数可指定分区和特定offset)

(1)同步提交

(2)异步提交

 
Rebalance机制Consumer Leader 统一计算好后,发给服务器,然后服务器再下发给所有Consumer每一个Consumer单独计算,彼此不知道对方的计算结果RocketMQ在某些特殊情况下(Master挂掉的同事,Comsumer有变动) 会出现 一个MessageQueue被多个Comsumer消费的情况
Rebalance策略

1、Range(默认)(每个topic单独计算,如果订阅的topic比较多,会造成比较严重的分配不均)

2、RoundRobin:消费组内所有消费者以及消费者所订阅的所有topic拉通全量计算,可以解决以上问题

  • AllocateMessageQueueAveragely:平均分配(默认)

  • AllocateMessageQueueAveragelyByCircle:循环分配

  • AllocateMessageQueueConsistentHash:一致性哈希

  • AllocateMessageQueueByConfig:根据配置进行分配

  • AllocateMessageQueueByMachineRoom:根据机房

  • AllocateMachineRoomNearby:就近分配

 
数据可靠性

某些情况下能实现

Exactly Once

只能实现

at least Once

kafka:producer在同一个会话中 会有seq number计数,来保证发送端的幂等性。

RocketMQ在producer发送不成功后有重试,可能发送重复数据

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值