面试题
1.生产者
1.1 消息丢失
- acks=0或者1
- 未启用重试机制
- 对失败消息没做处理
如何防止消息丢失?
-
配置acks=all: 确保消息在分区的所有同步副本(
ISR副本: Leader + Follower
)都成功收到后,才向生产者确认。- 存在的问题: Broker在处理消息时遇到临时故障,例如某个副本不可用,此时会向生产者返回一个错误响应。如果生产者没有重试机制,那么在收到错误响应后,生产者可能会直接丢弃该消息,从而导致消息丢失。
-
启用重试机制: 生产者在遇到临时故障时会自动重试发送消息
- 作用: 主要是为了解决短暂的、可以在短时间内恢复的故障(临时故障、网络波动、副本重启、临时资源不足等)。
- 存在的问题: 当重试次数达到设定的最大重试次数后,如果消息仍然无法成功发送,消息就会被丢弃,从而导致消息丢失。
-
监控失败消息: 生产者可以通过实现
Callback
接口,在消息发送成功或失败时执行特定的逻辑。这种方法允许生产者在消息发送失败后执行自定义的处理逻辑,从而进一步减少消息丢失的风险。
1.2 消息重复发送
- 网络问题: 网络延迟或中断可能导致生产者在发送消息时未收到Broker的确认(ACK),即使Broker已经成功接收并存储了消息。生产者会认为发送失败,并重新发送消息,导致消息重复。
- 生产者重试机制: 当生产者没有收到Broker的确认时,它会根据配置的重试策略自动重试发送。每次重试都可能导致消息被重复发送。
- Broker故障: 如果Broker在消息处理后但在返回确认之前崩溃,生产者未能收到确认,可能会重发消息,导致Broker在恢复后收到重复的消息。
- 重启或故障恢复: 如果生产者在发送消息过程中发生崩溃或重启,可能会在恢复后重发之前的消息,导致重复。
如何防止消息被重复发送?
- 启用幂等性