不丢和不重,本身就是矛盾的
如何保证消息不丢失
chatGPT的回答:
Kafka 采用了多种方式来确保消息不会丢失:
持久化:Kafka 的消息是持久化存储的,即使在写入到磁盘之前,数据也会先写入到操作系统的页面缓存中,这样即使发生系统故障,也可以通过重新加载数据来恢复。
复制:Kafka 通过多个副本的方式来确保消息的可靠性。每个分区都可以配置多个副本,一个分区的副本分布在不同的 broker 上,如果一个 broker 故障,其他 broker 上的副本可以继续提供服务。Kafka 的副本同步策略有三种,分别是全部同步、一半同步、异步。
消费者位移:Kafka 通过记录消费者的位移信息来确保消息不会重复消费或漏消费。消费者可以提交自己已经消费过的消息的位移,这样即使消费者在消费过程中发生故障,也可以通过位移信息来恢复消费进度。
综上所述,Kafka 通过持久化、复制和消费者位移等多种机制来保证消息不会丢失。
生产者数据的不丢失: ack机制
消费者数据的不丢失: offset commit 来保证数据的不丢失,Kafka自己记录了每次消费的offset数值,下次继续消费的时候,会接着上次的offset进行消费
集群中broker的数据不丢失: 一般都会设置有replication(副本)的个数,生产者写入的时候首先根据分发策略(有partition按partition,有key按key,都没有轮询)写入到leader中,follower(副本)再跟leader同步数据,这样有了备份,也可以保证消息数据的不丢失
如何保证消息不被重复消费
chatGPT的回答:
Kafka 通过消费者位移(consumer offset)的方式来确保消息不被重复消费。消费者位移是消费者记录已经消费过消息的位置信息,当消费者重新连接到 Kafka 集群时,可以根据消费者位移来判断已经消费过的消息,从而避免重复消费。
具体来说,Kafka 的消费者位移有两种方式:
手动提交位移:消费者可以显式地调用 API 提交自己已经消费过的消息的位移,这样即使消费者在消费过程中发生故障,也可以通过位移信息来恢复消费进度。
自动提交位移:消费者可以配置自动提交位移的方式,在消费者每次拉取到消息后自动提交位移信息。这种方式虽然简单,但是可能会导致消息重复消费的情况,因为消费者可能在消费消息后,但在提交位移信息之前发生故障。
另外,消费者还可以根据消息的唯一标识符来判断消息是否已经被消费过,例如,在消费消息时将消息的唯一标识符存储在数据库中,每次消费消息时先查询数据库中是否已经消费过该消息。但是这种方式需要额外的存储开销,并且需要保证消息的唯一标识符不重复。
如何保证Kafka消息不被重复消费?(如何保证消息消费时的幂等性)
Kafka架构
图文来自Kafka系统架构
图文来自Kafka 架构设计及原理


原文链接: https://dashen.tech/2021/04/15/Kafka相关面试题/
版权声明: 转载请注明出处.