RocketMQ面试题

这次又写信给哪位 2022-03-06 20:55:32
加精

1.请描述一下RocketMQ与kafak的区别?

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性能却降低了可靠性

那RocketMQ为什么要这样设计?

  1. kafak中Producer调用发送消息接口,消息未发送到Broker,向业务返回成功,此时Producer宕机,会导致消息丢失,业务出错,这样看来kafak可靠性不如RocketMQ,这也是RocketMQ作为互联网金融业务的首选;
  2. kafka是一个分区一个文件。当topic过多,分区的总量也会增加,kafka中存在过多的文件,当对消息刷盘时,就会出现文件竞争磁盘,出现性能的下降。

而且,一个分区只能被一个消费组中的一个消费线程进行消费,因此可以同时消费的消费端也比较少。

其他区别请看这里

本文引用
blog.csdn.net/z69183787/a…
www.cnblogs.com/cai-cai777/…

RocketMQ为什么自研nameserver而不用zk?

  1. RocketMQ只需要一个轻量级的维护元数据信息的组件,为此引入zk增加维护成本还强依赖另一个中间件了。
  2. RocketMQ追求的是AP,而不是CP,也就是需要高可用。
  • zk是CP,因为zk节点间通过zap协议有数据共享,每个节点数据会一致,但是zk集群当挂了一半以上的节点就没法使用了。
  • nameserver是AP,节点间不通信,这样会导致节点间数据信息会发生短暂的不一致,但每个broker都会定时向所有nameserver上报路由信息和心跳。当某个broker下线了,nameserver也会延时30s才知道,而且不会通知客户端(生产和消费者),只能靠客户端自己来拉,rocketMQ是靠消息重试机制解决这个问题的,所以是最终一致性。但nameserver集群只要有一个节点就可用。

msgKey,msgId,offsetMsgId的区别

blog.csdn.net/prestigedin…
index file用来做索引的key,如果发送端设置了msg key,则用这个,如果没有,则用msgId,因为msgId是生产端生成的全局唯一id

 

 

以下是一些学习资料!


 

...全文
477 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-Java 发布问题, 以便更快地解决您的疑问

68

社区成员

发帖
与我相关
我的任务
社区描述
RocketMQ开发者
其他 企业社区
社区管理员
  • csdnsqst0029
  • 程序员可乐丶
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧