Kafka 在设计中虽强调高可靠,但在特定配置或异常场景下仍可能发生消息丢失。以下是主要风险点及发生机制:
一、生产者端消息丢失
-
异步发送 + 无回调确认
- 场景:
producer.send(msg)
使用异步发送,但未处理回调(如未监听Future
或Callback
)。 - 风险:消息发送失败(如网络抖动、Broker 宕机)时,生产者无法感知,且无重试。
- 解决方案:
producer.send(msg, (metadata, exception) -> { if (exception != null) { // 重试或记录日志 } });
- 场景:
-
acks=0 或 acks=1
acks=0
:生产者不等待 Broker 确认,直接发送下一条(极易丢失)。acks=1
:仅等待 Leader 写入本地日志(非副本同步)。若 Leader 宕机且数据未同步到 Follower,新 Lead