68
社区成员




RocketMQ是根据kafak的架构原型设计出来的,有很多地方都相似,consumer、producer、broker,甚至RocketMQ初期也是用zookeeper做注册中心。
首先RocketMQ吞吐量TPS是在10万级别,kafak到了百万级别,RocketMQ貌似比kafak的tps小
这是由消息存储架构决定的,kafak采用的是每个Partition(类比于RocketMQ的queue)一个文件,而RocketMQ采用的是所有topic都存储在一个文件commitLog(超过1个G会重建一个文件)。那mq中影响tps的两个关键因素:消息写入(生产)、消息读取(消费)。
在这一块kafak和rocketmq设计和使用到的技术基本一致:
1) 顺序写入
2) 利用OS提供的pageCache来实现mmap(内存映射文件),java中是通过NOI提供的MappedByteBuffer类具体实现的
两者都采用了一个技术叫做零拷贝,这样就不用先将磁盘内容从内核空间(磁盘的)拷贝到用户空间,再从用户空间拷贝到内核空间(socket的),而是直接从内核转到内核,java里面是通过NIO提供的FileChannel实现。
由于RocketMQ所有topic消息都存在一个文件中,读取是根据consumerQueue文件里的offset去读取的,所以是随机读取。正因为此,RocketMQ的TPS不如kafak。
除此之外还有一个原因:
kafka采用异步发送的机制,当发送一条消息时,消息并没有发送到broker而是缓存起来,然后直接向业务返回成功,当缓存的消息达到一定数量时再批量发送。此时减少了网络io,从而提高了消息发送的性能,但是如果消息发送者宕机,会导致消息丢失,业务出错,所以理论上kafka利用此机制提高了io性能却降低了可靠性。
而且,一个分区只能被一个消费组中的一个消费线程进行消费,因此可以同时消费的消费端也比较少。
其他区别请看这里
本文引用
blog.csdn.net/z69183787/a…
www.cnblogs.com/cai-cai777/…
blog.csdn.net/prestigedin…
index file用来做索引的key,如果发送端设置了msg key,则用这个,如果没有,则用msgId,因为msgId是生产端生成的全局唯一id