Kafka如何确保生产者消息的可靠性?

Kafka为了确保producer的消息能可靠的发送到topic,topic的每个分区接收到producer的消息后,都会向producer返回 ack 确认收到。如果producer收到ack,就发送下一条消息,否则重新发送。

发送ack的时机

Kafka为了保证数据不丢失,每个分区的数据都有其对应的副本。Kafka集群节点会向Zookeeper注册,抢占Controller,Controller负责选举leader和follower。每个分区的leader和follower组成一组ISR(in-sync replica set )集合。
ack=0

  • ack设置为0时,如上图所示,一旦broker(节点)接收到数据就返回ack。这种操作提供了最低的延迟,但是此时数据还没有落地到磁盘,一旦在落盘之前broker发生故障,那么就会造成数据的丢失。
    在这里插入图片描述

  • ack设置为1时,如上图所示,一旦leader将数据落地到磁盘,不用等待ISR集合中其他的follower同步数据就返回ack。一旦follower同步数据之前,leader挂掉,也会造成数据的丢失。
    在这里插入图片描述

  • ack设置为-1或者all时,如上图所示,ISR集合中所有的follower数据落地到磁盘后,才会向producer返回ack。这种方式不会造成数据的丢失,但是如果在broker向producer发送ack之前,节点宕机,producer会再次发送数据,会造成数据的重复。

猜你喜欢

转载自blog.csdn.net/FlatTiger/article/details/114116287