kafka常见面试题目详解

2020-03-19  本文已影响0人  雪飘千里

一:kafka 和 rabbitmq区别

1、吞吐量:

kafka吞吐量更高:
  1)Zero Copy机制,内核copy数据直接copy到网络设备,不必经过内核到用户再到内核的copy,减小了copy次数和上下文切换次数,大大提高了效率。
  2)磁盘顺序读写,减少了寻道等待的时间。
  3)批量处理机制,服务端批量存储,客户端主动批量生产数据/消费数据,消息处理效率高。
  4)存储具有O(1)的复杂度,读取因为分区和segment,是O(log(n))的复杂度。
  5)分区机制,有助于提高吞吐量。

2、有序:

kafka是分区有序的,而rabbitmq没法保证顺序

rabbitmq服务器按照顺利保留消息到队列,如果有多个consumer来消费队列中的消息,服务器会按接收消息的顺序向外提供消息,但是,尽管服务器是按照顺序提供消息,但是消息传递到每一个consumer是异步的,这可能会导致消费的consumer获取到消息的时间可能比后消费的consumer获取到消息的时间长,导致不能保证顺序性

rabbitmq要保证消息有序可以在运用层面,通过在消息实体中增加:版本号 & 状态机 & msgid & parent_msgid,通过 parent_msgid 判断消息的顺序(需要全局存储,记录消息的执行状态)。
比如下单操作,下单成功之后,会发布创建订单和扣减库存消息,但扣减库存消息执行会先于创建订单消息,也就说前者执行成功之后,才能执行后者。
所以在创建订单消息中的parent_msgid就是扣减库存消息id,这样在执行创建订单时,先去查询partent_magid(也就是扣减库存消息id)是否执行成功。

3、可靠性

rabbitmq可靠性更好:
  1)确认机制(生产者和exchange,消费者和队列);
  2)支持事务,但会造成阻塞;
  3)委托(添加回调来处理发送失败的消息)和备份交换器(将发送失败的消息存下来后面再处理)机制;

kafka:
  1)没有消息确认机制,kafka是通过consumer提交消息消费的offset来控制消息消费的。
  2)0.11.0之后支持事务

4:持久化

RabbitMQ对于queue中的message的保存方式有两种方式:disc(磁盘持久化)和ram(内存);
不管是持久化的消息还是非持久化的消息都可以被写入到磁盘。持久化的消息在到达队列时就被写入到磁盘,并且如果可以,持久化的消息也会在内存中保存一个备份,这样就可以提高一定的性能,当内存吃紧的时候会从内存中清除。
非持久化的消息一般只保存在内存中,在内存吃紧的时候会被换入到磁盘中,以节省内存空间。这两种类型的消息的落盘处理都在RabbitMQ的“持久层”中完成。

消息持久化的好处是在RabbitMQ服务器挂了后,message仍然可以在重启之后恢复;
非持久化的消息则不会恢复,但是RabbitMQ处理message的效率要高很多;

5、集群负载

kafka采用zookeeper对集群中的broker、consumer进行管理,可以注册topic到zookeeper上;通过zookeeper的协调机制,producer保存对应topic的broker信息,可以随机或者轮询发送到broker上;并且producer可以基于语义指定分片,消息发送到broker的某分片上。

rabbitMQ的负载均衡需要单独的loadbalancer进行支持。

6、应用场景:

RabbitMQ:用于实时的,对可靠性要求较高的消息传递上。
kafka:用于处于活跃的流式数据,大数据量的数据处理上。

7、:RabbitMq exchange类型

二:kafka的架构 组件

Topic:是一个高层次的抽象概念,kafka按照Topic分类来维护消息;
Producter:将发布publish消息到Topic的进程称之为生产者producter;
Consumer:将订阅subscribe topic 并且处理Topic中消息的进程称之消费者consumer;
Broker:kafka以集群的方式运作,集群中的每一台服务器称之为一个代理broker;
Zookeeper:存储topic信息,和元数据信息,新建的topic都会在zookeeper中存在

image.png

三:kafka的安全性和可靠性如何保证

问题四:kakfa吞吐量大 原因??

kafka消息是保存在日志文件中的,客户端不断的去读,IO操作,为啥性能还是很高效

image.png

而零拷贝,数据不再复制到用户缓存去,是在Linux kernel(内核)2.2之后出现的,减少了一次读取,一个写入的操作,但是多了一次从读缓冲区(read buffer)中的数据拷贝到的网络缓冲区(socket buffer)的过程,如下

image.png

更详细的零拷贝知识见这里
零拷贝

image.png

四:kafka有序么

partition有序,如果一个topic有多个partition,则只有在partition内才有序,如果要保证topic有序,则设置成一个partition;一个partition对应一个commit-log日志文件

五:kafka如何保证消息不被重复消费

重复消费:同一条消息被消费者消费了多次
解决方法:

六:kafka分区leader选举原理

主要是利用了多个从节点向zookeeper创建临时节点,如果创建成功,则从节点为主节点,而其他从节点则从临时节点中读取主节点信息(类似分布式锁)

image.png
上一篇下一篇

猜你喜欢

热点阅读