acks:(一般来讲通过acks设置all,加上业务捕捉异常记录表,就能知道kafka生产者发送的情况)


ACKS为 0:(消息发出去了,不管有没有落到磁盘上,就认为成功)

我的kafkaProducer在客户端,只要把消息发送出去,不管那条数据有没有在哪怕Partition Leader上落到磁盘,就不管他了,直接认为这个消息发送成功。

如果你采用这种设置的话,那么你必须注意的一点是,可能你发送出去的消息还在半路。结果呢,Partition Leader所在Broker就直接挂了,然后结果你的客户端还认为消息发送成功了,此时就会导致这条消息就丢失了。

ACKS为 1:(节点和节点之间同步失败了,客户端也以为发送成功了)

只要Partition Leader接收到消息而且写入本地磁盘了,就认为成功了,不管其他的Follower有没有同步过去这条消息了。

这种设置其实是kafka默认的设置方式也就是说默认情况下,要是不设置这个参数,只要Partition Leader写成功就算成功。但是这里有一个问题,万一Partition Leader刚刚接收到消息,Follower还没来得及同步过去,结果Leader所在的broker宕机了,此时也会导致这条消息丢失,因为人家客户端已经认为发送成功了。

ACKS为 ALL:(Follower都要把消息同步过去,才能认为这条消息是写入成功了。)

Partition Leader接收到消息之后,还必须要求ISR(副本同步队列)列表里跟Leader保持同步的那些 Follower都要把消息同步过去,才能认为这条消息是写入成功了。

如果说Partition Leader刚接收到了消息,但是结果Follower没有收到消息,此时Leader宕机了,那么客户端会感知到这个消息没发送成功,他会重试再次发送消息过去。

此时可能Partition 2的Follower变成Leader了,此时ISR列表里只有最新的这个Follower转变成的Leader了,那么只要这个新的Leader接收消息就算成功了。

注意: 如果kafka的Partition只有一个副本,也就是一个leader,没有follower,就相当于单机点了,单节点宕机了,数据还是会丢失.


retries:(默认为0)


retries参数的值决定了生产者可以重发消息的次数,如果达到这个次数,生产者会放弃重试并返回错误,一般我们可以通过配置重试次数来让生产者重新发送消息。比如配置retries=3,默认为0


factor:


applicatoin配置展现:default.replication.factor =1

replication-factor:用来设置主题的副本数。每个主题可以有多个副本,副本位于集群中不同的broker上,也就是说副本的数量不能超过broker的数量,否则创建主题时会失败


kafka的leader和follower


kafka的leader负责处理读写操作,而follower只负责副本数据的同步,如果leader出现故障,其他Follower会被重新选举leader,follower像一个consumer一样,拉去leader对应分区的数据,并保存到数据文件中


Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐