Kafka 的消息提供了三种保证模式:
- At Most Once:消息可能会丢失,但绝不会重复发送。
- At Least Once:消息绝不会丢失,但可能会重复发送。
- Exactly Once:每条消息只会发送一次,即不会丢失也不会重复。
At Most Once 的实现机制是:
- 生产者发送消息后不等待Broker的ACK,直接发送下一条消息。
- 如果Broker在接收消息后发生故障,导致消息丢失,生产者不会重发。
- 消费者在消费消息后直接提交Offset,不等待消费结果的应答。
- 如果消费者在消费后提交Offset前发生故障,那么会导致某些消息被重复消费。
At Least Once 的实现机制是:
- 生产者发送消息后等待Broker的ACK确认,如果长时间未收到ACK会重发消息。
- 消费者在消费消息后提交Offset,如果提交失败会重复提交,直到成功。
- 如果消费者在消费消息后提交Offset前发生故障,那么会导致某些消息被重复消费。
Exactly Once 的实现机制是:
- 生产者发送消息后等待Broker的ACK确认,并且消息会写入磁盘后再发送ACK。如果生产者重启可以保证不重复发送消息。
- 消费者在消费消息后不直接提交Offset,而是发送消费确认给Broker。
- Broker在接收到消费确认后会将消息的Offset保存至磁盘,然后发送确认给消费者。
- 消费者在收到Broker的确认后会提交Offset,如果提交失败会重复此过程。
- 如果消费者发生故障可以根据已提交的Offset继续消费,不会重复消费消息。
理解 Kafka 的消息保证机制,可以让我们为不同的应用场景选择合适的保证模式。