ACK配置
生产者同步发送消息的时候,生产者在获得集群返回的ACK前会一直阻塞,那么集群什么时候给生产者返回ACK呢?
在Kafka中,ACK(Acknowledgement)是一种确认机制,用于确保消息的可靠传递。当Producer发送消息给Kafka的一个分区时,Producer可以选择是否等待Broker对消息的接收进行确认。ACK机制提供了三种级别的确认:
1. `acks=0`:Producer发送消息后,不需要等待Broker的确认即可继续发送下一条消息。这种方式是最快的,但也是最不可靠的,因为消息可能会丢失而不被发现。
2. `acks=1`:Producer发送消息后,等待Broker的确认。一旦Broker接收到消息并写入到本地日志中,就会发送ACK给Producer,表示消息已成功写入。在这种级别下,如果Leader Broker接收消息后立即崩溃,并且尚未将消息完全复制到所有ISR(In-Sync Replicas)中,那么消息可能会丢失。
3. `acks=all`:Producer发送消息后,等待所有ISR中的Broker进行确认。只有当所有ISR Broker都接收到消息并写入到本地日志中,才会发送ACK给Producer。这是最可靠的确认级别,因为只有在多个副本都写入成功的情况下,才能确保消息不会丢失。
选择ACK级别时需要权衡消息的可靠性和性能。较低的ACK级别可以提高吞吐量,但会增加消息丢失的风险;较高的ACK级别可以提供更高的可靠性,但会带来较高的延迟。因此,需要根据具体业务需求和实际情况来选择最合适的ACK级别。
在Kaka中,有三种ACK配置方式其中,ack=1是系统默认的配置
在Java中手动配置ACK
重试间隔设置
Kafka提供了重试机制来处理发送失败的消息。当Producer向Kafka发送消息时,如果发生了发送失败的情况,Kafka会根据配置的重试间隔来尝试重新发送消息。
重试间隔是指在发送失败后,等待多久再次尝试发送消息。Kafka的重试间隔可以通过配置参数来设置,常用的参数有以下两个:
retries
:表示发送失败后的重试次数,默认值为0。设置为0表示不进行重试,非负数表示进行重试的次数(不包括第一次发送)。每次重试间隔时间递增,按照2的指数进行递增,即第一次重试间隔为retry.backoff.ms
,第二次为retry.backoff.ms * 2
,以此类推。retry.backoff.ms
:表示重试前等待的初始时间间隔,默认值为100ms。如果设置了retries
大于0,则每次重试都会等待一段时间后再尝试发送。这个时间间隔会随着重试次数的增加而指数级增加。
通过设置适当的重试间隔,可以确保在网络或服务中断等临时故障的情况下,Producer能够尽可能多次地尝试发送消息,增加消息发送的成功率。但是需要注意的是,设置过大的重试间隔可能会导致消息发送延迟增加,因此需要根据具体业务需求和实际情况来进行设置。
配置重试间隔的问题见下图注释
发送消息缓冲机制
Kafka的消息缓冲机制是指在Producer端和Consumer端之间存在一个消息缓冲区,用来临时存储消息。这个缓冲区有助于提高系统的吞吐量和性能。
在Producer端,消息缓冲区主要用于临时存储待发送的消息。当Producer产生一条消息时,首先将消息写入到缓冲区中,然后由Kafka的发送线程发送到Kafka集群。这样可以避免每条消息都直接发送到Kafka集群,提高了消息的发送效率。
在Consumer端,消息缓冲区主要用于临时存储从Kafka集群拉取到的消息。当Consumer拉取消息时,将消息先存储到缓冲区中,然后再进行处理。这样可以一次性拉取多条消息,减少了网络传输的开销,提高了消息处理的效率。
Kafka的消息缓冲机制还具有一定的容错能力。当Producer或Consumer发生故障时,已经写入或拉取到的消息仍然保存在消息缓冲区中,待故障恢复后可以重新发送或处理这些消息。
需要注意的是,Kafka的消息缓冲机制并不保证消息的可靠性。一旦消息写入到缓冲区中,就会被认为已经发送成功,但实际上可能由于各种原因导致消息发送失败。因此,在使用Kafka时,还需要根据具体业务需求,选择合适的消息可靠性保证机制,如设置消息的副本数、使用acks参数等。
1、缓冲区和本地线程工作流程图
2、Java中的配置
下面主要是有两个参数比较重要,分别是缓冲区大小和Broker一次性拉取数据量大小
至此,关于Kafka的生产者常见的配置介绍完毕,后续还会持续向该文档中补充更加全面的配置,希望大家能持续的关注~~~~~~