面试题答案
一键面试acks参数
- 作用:
acks = 0
:生产者在发送消息后,不需要等待任何来自broker的确认,直接认为消息发送成功。这种情况下,消息发送速度最快,但存在消息丢失的风险,因为如果broker没有收到消息,生产者也不会知晓。acks = 1
:生产者在发送消息后,等待leader副本成功写入消息后就认为消息发送成功。如果leader副本在写入消息后但还未同步给follower副本时发生故障,可能会导致消息丢失。acks = all
或acks = -1
:生产者在发送消息后,等待所有的ISR(In - Sync Replicas,与leader副本保持同步的副本集合)中的副本都成功写入消息后才认为消息发送成功。这提供了最高的消息持久性保证,但可能会降低消息发送的吞吐量。
- 调整策略:
- 如果对消息的持久性要求不高,追求高吞吐量,可以选择
acks = 0
。例如,在一些实时监控日志但允许少量日志丢失的场景。 - 对于大多数常规场景,
acks = 1
可以在吞吐量和可靠性之间取得较好的平衡。 - 如果数据非常关键,不允许丢失任何消息,如金融交易日志等场景,应选择
acks = all
或acks = -1
。
- 如果对消息的持久性要求不高,追求高吞吐量,可以选择
retries参数
- 作用:指定生产者在发送消息失败时的重试次数。当生产者发送消息遇到可重试的错误(如网络抖动导致的连接问题等)时,会按照设定的次数进行重试。
- 调整策略:
- 如果网络环境较为稳定,可适当减少重试次数,如设置为3 - 5次。这样可以避免在稳定网络下不必要的重试,提高消息发送效率。
- 如果网络环境不稳定,经常出现短暂的连接中断等问题,可以适当增加重试次数,如设置为10次甚至更多,以确保消息尽可能发送成功。但要注意,过多的重试可能会导致消息发送延迟增加。
batch.size参数
- 作用:指定生产者批量发送消息的缓冲区大小(单位为字节)。生产者会将消息收集到这个缓冲区,当缓冲区达到这个大小或者达到
linger.ms
设置的时间时,就会将缓冲区中的消息批量发送出去。 - 调整策略:
- 如果消息数据量较小,且希望提高吞吐量,可以适当增大
batch.size
,例如设置为16384(16KB)。这样可以让更多的消息在缓冲区积累,一次批量发送,减少网络请求次数,提高吞吐量。 - 如果消息数据量较大,为了避免缓冲区占用过多内存,可适当减小
batch.size
,如设置为4096(4KB)。同时,结合linger.ms
参数,控制消息的发送时机,以平衡内存占用和吞吐量。
- 如果消息数据量较小,且希望提高吞吐量,可以适当增大