带着问题去学习
- zk在kafka中扮演什么作用?
- 保存元数据,比如broker信息,分区信息,消费者的偏移量
- leader选举
- 集群监控,比如集群节点的健康检查
kafka中leader挂掉,其他的follower是如何成为leader的?
kafka中的消息传递语义
- At most once - 消息可能丢失,但是不会重复发送
- At least once - 消息不可能丢失,但是会重复
- Exactly once - 每个消息仅仅传递一次
- 幂等性生产者
Kafka 的幂等性生产者是为了确保相同的消息在同一个分区上只被写入一次而设计的。这样可以防止生产者在发送消息时因为一些网络问题或者其他错误导致消息的重复写入。幂等性生产者引入了一些机制来保证这一点:
Producer Id(生产者ID): 每个生产者实例都会被分配一个唯一的 Producer Id(PID)。这个 ID 在生产者的整个生命周期内是固定的,它用于标识消息是由哪个生产者发送的。Producer Id 会与一个 epoch(时期)结合,以确保即使生产者发生重新启动,也能够继续使用相同的 Producer Id。
Sequence Number(序列号): 每个消息都有一个单调递增的序列号,它是由生产者维护的。序列号的目的是为了确保消息的顺序和一致性。Kafka 使用 Producer Id 和 Sequence Number 来唯一标识一个消息。
Broker 端幂等性处理: Kafka 的 broker 端会检测到来自生产者的重复消息,并根据 Producer Id 和 Sequence Number 进行过滤。如果 broker 收到的消息具有相同的 Producer Id 和较小或相同的 Sequence Number,则它会认为这是一条重复消息,并将其过滤掉。
Acknowledge(应答机制): 幂等性生产者使用 ACK(应答机制)来确认消息是否成功写入到分区。如果消息在写入后收到了分区的 ACK,那么生产者会认为消息已经成功写入,否则会重试。这确保了消息的可靠性。
通过这些机制,Kafka 的幂等性生产者可以在面临网络故障、生产者重启等情况下,确保相同的消息不会被重复写入到同一个分区。这对于保证消息的一次性投递非常重要,特别是在涉及到事务性和精确一次性语义的场景中。
- kafka会不会丢失消息
会丢失,broker、producer、consumer都可能会丢失消息
https://zhuanlan.zhihu.com/p/307480336