面试题答案
一键面试acks配置对性能和数据可靠性的影响
- acks=0
- 性能:生产者发送消息后不需要等待任何来自broker的确认,所以性能最高,消息发送速度最快。因为生产者只管将消息发送到网络中,而不需要等待broker的响应。
- 数据可靠性:数据可靠性最低。如果网络出现问题,消息可能丢失,因为生产者没有得到broker已接收消息的确认。
- acks=1
- 性能:生产者发送消息后等待leader副本确认。性能相对acks=0有所下降,因为需要等待leader的确认,但相比于acks=all还是较快的。leader确认后,生产者就可以继续发送下一条消息。
- 数据可靠性:数据可靠性中等。只要leader副本成功接收消息,就认为消息发送成功。但如果leader副本在确认后,follower副本还未同步消息时leader挂掉,可能会丢失消息。
- acks=all(或acks=-1)
- 性能:生产者发送消息后等待所有同步副本(ISR中的副本)确认。性能最低,因为需要等待所有同步副本都确认消息已接收,这增加了消息发送的延迟。
- 数据可靠性:数据可靠性最高。只有当所有同步副本都确认接收消息后,生产者才会认为消息发送成功,这样可以保证即使leader副本挂掉,也不会丢失消息,因为其他同步副本中已经有了该消息。
retries配置对性能和数据可靠性的影响
- retries设置为0
- 性能:如果消息发送失败,不会进行重试,消息发送速度相对较快(在不考虑失败情况时)。但一旦遇到可重试的错误(如网络瞬时故障),消息就直接失败。
- 数据可靠性:数据可靠性较低,对于可恢复的错误,不重试可能导致消息丢失。
- retries设置为较大值
- 性能:如果消息发送失败,会按照设置的次数进行重试。这可能会增加消息发送的总时间,因为每次重试都需要等待一定时间(由retry.backoff.ms控制),从而降低了整体性能。
- 数据可靠性:数据可靠性较高,对于一些临时性的错误(如网络抖动、leader选举等),通过重试可以确保消息最终成功发送到broker。
不同业务场景下的权衡策略建议
- 对性能要求极高,对数据可靠性要求相对较低的场景(如日志收集)
- acks:可以设置为0。日志收集场景下,少量日志丢失对整体业务影响不大,而追求高吞吐量可以快速收集大量日志数据。
- retries:设置为0或较小值。因为即使有少量消息发送失败,也不影响整体日志数据的分析和使用,不需要过多重试降低性能。
- 对性能和数据可靠性都有一定要求的场景(如普通业务消息传递)
- acks:设置为1。在保证一定数据可靠性的前提下,尽量提高性能。大多数情况下,leader副本成功接收消息就足以满足业务需求,同时不会像acks=all那样带来过高的延迟。
- retries:设置一个适中的值(如3 - 5),并合理调整retry.backoff.ms。这样在遇到常见的可恢复错误时,可以进行一定次数的重试,保证消息尽可能成功发送,同时不会因为过多重试而严重影响性能。
- 对数据可靠性要求极高,对性能要求相对较低的场景(如金融交易消息)
- acks:设置为all(或acks=-1)。确保所有同步副本都确认消息,最大程度保证数据不会丢失,这对于金融交易等不能容忍数据丢失的场景至关重要。
- retries:设置为较大值(如10以上),并合理调整retry.backoff.ms。因为此类场景下数据的完整性至关重要,即使性能有所牺牲,也要通过多次重试保证消息成功发送。同时,还可以结合幂等性生产者(enable.idempotence=true),避免由于重试导致的重复消息问题。