Broker差别

主从差别: kafka的master/slave是基于partition维度的,而rocketmq是基于broker维度的;kafka的master/slave是能够切换的,而rocketmq不行,当rocketmq的master宕机时,读能被路由到slave上,但写会被路由到此topic的其余broker上。

刷盘: rocketmq反对同步刷盘,也就是每次音讯都等刷入磁盘后再返回,保障音讯不失落,但对吞吐量稍有影响。个别在主从构造下,抉择异步双写策略是比拟牢靠的抉择。

音讯查问:rocketmq反对音讯查问,除了queue的offset外,还反对自定义key。rocketmq对offset和key都做了索引,均是独立的索引文件。

生产失败重试与提早生产: rocketmq针对每个topic都定义了提早队列,当音讯生产失败时,会发回给broker存入提早队列中,每个消费者在启动时默认订阅提早队列,这样生产失败的音讯在一段时候后又可能从新生产。延迟时间适宜提早级别一一对应的,延迟时间是随失败次数逐步减少的,最初一次距离2小时。

当然发送音讯是也能够指定提早级别,这样就能被动设置提早生产,在一些特定场景下还是有作用的。

数据写入: kafka每个partition独占一个目录,每个partition均有各自的数据文件.log;而rocketmq是每个topic共享一个数据文件commitlog因为kafka的topic个别有多个partition,所以kafka的数据写入熟读比rocketmq高出一个量级。但超过肯定数量的文件同时写入,会导致原先的程序写转为随机写,性能急剧下降,所以kafka的分区数量是有限度的。

服务治理: kafka用zookeeper来做服务发现和治理,broker和consumer都会向其注册本身信息,同时订阅相应的znode,这样当有broker或者consumer宕机时能立即感知,做相应的调整;而rocketmq用自定义的nameServer做服务发现和治理,其实时性差点,比方如果broker宕机,producer和consumer不会实时感知到,须要等到下次更新broker集群时(最长30S)能力做相应调整,服务有个不可用的窗口期,但数据不会失落,且能保障一致性。然而某个consumer宕机,broker会实时反馈给其余consumer,立刻触发负载平衡,这样能肯定水平上保障音讯生产的实时性。

Producer差别

发送形式:kafka默认应用异步发送的模式,有一个memory buffer暂存音讯,大数据培训同时会将多个音讯整合成一个数据包发送,这样能进步吞吐量,但对音讯的实效有些影响;rocketmq可抉择应用同步或者异步发送。

发送响应:kafka的发送ack反对三种设置:音讯存进memory buffer就返回;等到leader收到音讯返回,等到leader和isr的follower都收到音讯返回,当然kafka都是异步刷盘。rocketmq都须要等broker的响应确认,有同步刷盘,异步刷盘,同步双写,异步双写等策略,相比于kafka多了一个同步刷盘。

Consumer差别

音讯过滤: rocketmq的queue和kafka的partition对应,但rocketmq的topic还能更加细分,可对音讯加tag,同时订阅时也可指定特定的tag来对音讯做更进一步的过滤。或者向服务器上传一段Java代码,能够对音讯做任意模式的过滤,甚至能够做Message Body的过滤拆分。
有序音讯:rocketmq反对全局有序和部分有序,kafka也反对有序音讯,然而如果某个broker宕机了,就不能在保障有序了。

生产确认:rocketmq仅反对手动确认,也就是生产完一条音讯ack+1,会定期向broker同步生产进度,或者在下一次pull时附带上offset。kafka反对定时确认,拉取到音讯主动确认和手动确认,offset存在zookeeper上。

生产并行度:kafka的消费者默认是单线程的,一个Consumer能够订阅一个或者多个Partition,一个Partition同一时间只能被一个消费者生产,也就是有多少个Partition就最多有多少个线程同时生产。

rocketmq消费者分有序生产模式和并发生产模式,有序模式下,一个消费者也只存在一个线程生产;并发模式下,每次拉取的音讯按consumeMessageBatchMaxSize(默认1)拆分后调配给消费者线程池,消费者线程池min=20,max=64。也就是每个queue的并罚度在20-64之间,一个topic有多个queue就相乘。所以rocketmq的并发度比Kafka高出一个量级。

事务音讯:rocketmq指定肯定水平上的事务音讯,以后开源版本删除了事务音讯回查性能,事务机制略微变得没有这么牢靠了,不过阿里云的rocketmq反对牢靠的事务音讯;kafka不反对分布式事务音讯。

生产实时性:kafka是通过短轮训模式拉取音讯,生产实时性取决于轮训距离;rocketmq是通过长连贯模式拉取音讯,当有新音讯时会立刻登程拉取,只有生产能力足够,实时性比价牢靠。