上面分析了一些保障数据不丢失的措施,在一定程度上可以避免数据的丢失。但是请注意:Kafka 只对“已提交”的消息(committed message)做有限度的持久化保证。所以说,Kafka不能够完全保证数据不丢失,需要做出一些权衡。
    首先,要理解什么是已提交的消息,当 Kafka 的若干个 Broker 成功地接收到一条消息并写入到日志文件后,它们会告诉生产者程序这条消息已成功提交。此时,这条消息在 Kafka 看来就正式变为已提交消息了。所以说无论是ack=all,还是ack=1,不论哪种情况,Kafka 只对已提交的消息做持久化保证这件事情是不变的。
    其次,要理解有限度的持久化保证,也就是说 Kafka 不可能保证在任何情况下都做到不丢失消息。必须保证Kafka的Broker是可用的,换句话说,假如消息保存在 N 个 Kafka Broker 上,那么这个前提条件就是这 N 个 Broker 中至少有 1 个存活。只要这个条件成立,Kafka 就能保证你的这条消息永远不会丢失。
    总结一下,Kafka 是能做到不丢失消息的,只不过这些消息必须是已提交的消息,而且还要满足一定的条件。