Kafka 高吞吐、消息丢失场景、副本维护、Leader 选举以及消息幂等性保证
Kafka 高吞吐原因:
- 分区机制: Kafka 的分区机制使得多个消费者可以并行消费,提高了整体的吞吐量。
- 水平扩展: Kafka 支持水平扩展,可以通过增加分区数、增加副本数、增加Broker等方式来提高整体吞吐量。
- 零拷贝技术: Kafka 使用零拷贝技术,减少了数据在内存之间的拷贝次数,提高了数据传输的效率。
- Batch 发送: 生产者可以批量发送消息,减少网络开销,提高了吞吐量。
- 异步 IO: Kafka 使用异步 IO 操作,当生产者发送消息时,不会等待服务器的响应,从而提高了生产者的吞吐量。
- 压缩技术: Kafka 支持消息的压缩,可以减小消息的体积,提高了网络传输的效率。
Kafka 丢失消息的场景:
- Replication Factor 设置不合理: 如果 Replication Factor 设置为 1,当某个 Broker 宕机时,可能导致消息丢失。建议设置合理的 Replication Factor。
- 生产者发送失败: 如果生产者发送消息失败,可能导致消息丢失。可以通过配置生产者的
acks 参数来确保消息发送的可靠性。
- 消息过期: 如果消息的
retention.ms 参数设置得太短,可能导致消息在存储时过期被删除,造成消息丢失。
Kafka 副本维护:
- ISR(In-Sync Replicas): ISR 是一组与 Leader 处于同步状态的副本,它们接收到了 Leader 的消息。Kafka 使用 ISR 机制来确保消息的可靠性。
- Replica Lag: 如果某个副本的同步进度落后于 ISR 中的其他副本,就会被踢出 ISR,不再参与消息的同步。
Kafka Leader 选举:
- 选举条件: 当 Leader 副本宕机或失去联系时,剩余的 ISR 中的副本会开始进行 Leader 选举。
- 选举原理: 剩余的 ISR 中副本会进行投票,选取第一个收到超过半数投票的副本作为新的 Leader。
- Leader 选举算法: Kafka 使用了一种基于 ZooKeeper 的 Leader 选举算法,确保选出的 Leader 是 ISR 中的一员。
Kafka 消息幂等性保证:
- Producer Id: 生产者在发送消息时,会携带一个唯一的 Producer Id,Kafka 利用 Producer Id 来保证消息的幂等性。
- Sequence Number: 每个消息都有一个唯一的 Sequence Number,Kafka 使用这个序列号来确保消息的顺序性。
- 幂等性写入: 如果生产者收到了消息发送的确认,但是网络异常导致 Broker 没有收到确认,生产者可以重试发送相同的消息,而不会产生重复消息。
- Exactly Once 语义: Kafka 提供了 Exactly Once 语义,通过生产者的幂等性和消费者的事务性来保证消息的精确一次传递。