Kafka的复习

  1. 为什么要使用Kafka

Kafka是一个消息引擎,或者说消息队列

其具有削峰的效果,可以将消息缓存,避免下游收到过多数据崩溃

解耦,可以让不同系统不必直接联系,而是只要符合约定即可,

广播,可以将一条消息广播给下游所有的系统

健壮性,具有对消息持久化高可用的保存能力

  1. Kafka消费过的消息如何重新消费

这一点,可以让consumer在启动的时候设置自己的消息位移,在此处可以设置制定的位移位置,也可以设置为一个虚化的概念,比如最早,最晚。

  1. Kafka的消息存储机制

首先说是存储在磁盘之上,不过利用了顺序写入文件,加上直接映射,从而加快了写入的速度

  1. Kafka的查找为什么这么快

首先,Kafka会分文件进行存储,无论是时间达到了,还是存储的文件大小达到了,都会进行分段。

其次是利用了大量的index文件进行加快查找

而且在实际的查找过程中,利用了二分法进行了快速查找,利用offset快速定位到了Message的文件位置。

  1. Kafka的消息保存机制

生产者的不丢失,这是在生产端发送消息的时候,可以设置ACK,可以设置为0,这样生产端发送数据不等待响应就继续发送

或者设置为1,这样需要leader落盘后才能发送下一条

设置完-1,则需要leader将消息发送给所有的ISR才能发下一条

对于消费者,则是由commit机制保证的,消费者的消费偏移量保存在了kafka中的一个内部topic,这样消费者可以保证不commit,消息就一直在

对于Kafka本身的消息,则是利用replication的概念进行保存,有了备份,所以不丢失。

  1. Kafka重启是否会数据丢失

因为进行了持久化保存,所以数据不会丢失。

  1. Kafka为什么不支持读写分离

Kafka支持的是主读主写的模型,而不是主写从读

之所以这样支持有两方面原因,一方面主写从读涉及到集群内不同节点的数据交换,必然有一定的延迟

另一方面,Kafka利用了收到消息即刻落盘,之后再读取的方式。从而加快了读取速度

而且没有延迟,没有数据不一致的问题

  1. Kafka数据分区和消费者的关系

一个分区可以对应多个消费组,但是对于一个消费组,只能由一个组内成员进行消费,从而避免重复消费。

  1. Kafka数据如何读取的

首先说根据consumer group中的分配到的分区,去kafka内部队列中,查看当前的group id对应的分区的偏移量。

然后连接对应分区的Leader Broker

将自己保存的offset发送给Leader

Leader 根据offset等信息定位到segment等索引文件

最后根据索引获取日志文件中的数据,并返回consumer进行消费

  1. 如何保证消息有序

因为一个topic下有多个partition,不能保证partition之间的有序性,所以一种解决方案就是把业务有序的打到同一个partition中。

  1. 消息堆积怎么办

对于消息堆积,要么考虑增加topic的分区数,并且增加消费者组的消费数。

要么就是增大处理能力。

  1. 单条消息最大上限

默认是1M,不过可以通过配置进行修改。

比如message.max.bytes 单个消息最大接受度

replica.fetch.max.bytes 同步的时候消息最大字节数,默认是1M

发表评论

邮箱地址不会被公开。 必填项已用*标注