谁无暴风劲雨时,守得云开见月明


什么是kafka

kafka是由java编写的高可用,高性能,高吞吐量的消息队列。
由以下组成:

zookeeper: 协调选举
消费者组: 数据消费
生成者: 数据生成
broker: kafka节点
分区: 负载均衡器
offset: 偏移量
leader: 消息分发节点
follower: 数据跟随节点
副本集: 从节点

kafka的ack机制

kafka的ack是针对生产者而言
ack有三种设置:-1,0,1

-1:等待从节点全部备份完成后返回ack。
0:不需要等待任何节点返回ack直接发送消息。
1:等待leader返回ack后发送消息

kafka如何解决消息重复问题

消费重复的问题的产生:
在ack机制为-1的时候,主节点更新完消息,从节点备份完消息,主在发送ack消息的时候主点挂了。从节点选举成主节点。
生成者没有ack消息,重新发送消息,造成节点信息写了2个一样的消息。

解决办法: 做幂等操作,加上token,发送的时候判断一下,存在则不发送。

kafka如何解决重复消费问题。

消息重复消费问题,发生在offset提交阶段发生错误,当重新启动程序读取的时候,会按配置文件的最小offset进行读取。

解决办法一
将消费记录token存入redis,cache等其他缓存当中。

解决办法二:
max.poll.records设置参数,设置拉取的条数,具体情况就需要按自己的程序需要进行设置。默认是500,无法完全避免重复消息问题,可以减少重复消费的条数。

kafka能不能保证消费顺序

在单个分区中能保证消费顺序,在多个分区中无法保证消费顺序。

kafka如何保证副本集都同步了数据

在每个分区当中都有个ISR集合,简单来说就是维护了leader和follower的表,直接用心跳机制进行维护。如果心跳断了,则剔除ISR集合。

kafka高水准,低水准

kafka在消息同步的时候发生了宕机了,主有100条,从只有90条,这个时候消费者去读取93,但是主宕机了,从变主了。kafka采用低水准对消费者可见,意思是消费者只能读90以下的数据,90以上的数据读取不到。

kafka是poll模型还是push模型

kafka是拉模型,poll可以根据自己的消费能力进行消费,而推容易产生消息堆积的问题。

推模型需要设置限流。等待ack进行返回再推.

数据传输的定义

最少一次(可能产生消费重复),最多一次(可能产生消费丢失),仅切只有一次(ack+幂等性)。

Kafka 分区数越多性能就越好吗? 为什么?

  1. 每个分区数都对应一个 log 文件,log 文件是顺序写的,但如果
    有非常多分区同时刷盘,就会变相成乱序写了,我猜想这也是为
    什么 RocketMQ 一个 broker 只会拥有一个 CommitLog 的原因
    之一吧;
  2. 客户端会为每个分区调用一条线程处理,多线程并发地处理分区
    消息,分区越多,意味着处理的线程数也就越多,到一定程度
    后,会造成线程切换开销大;
  3. 其中一个 broker 挂掉后,如果此时分区特别多,Kafka 分区
    leader 重新选举的时间大大增加;
  4. 每个分区对应都有文件句柄,分区越多,系统文件句柄就越多;
  5. 客户端在会为每个分区分配一定的缓冲区,如果分区过多,分配
    的内存也越大。