kafaka

kafka 架构图

kafka架构图

关于Kafka 的问题

kafka 是怎么做到 高吞吐率、速度快的?

顺序读写

partition 并行处理

Page Cache

零拷贝

零拷贝原理

mmap、sendfile

  • Producer生产的数据持久化到broker,采用mmap文件映射
  • Customer从broker读取数据,采用sendfile,将磁盘文件读到OS内核缓冲区后,直接转到socket buffer进行网络发送。

用户缓冲区、内核缓冲区、socket buffer、NIC buffer

定期 flush 到磁盘

分区分段+索引

数据压缩

批量读写

kafka 如何保证不重复消费又不丢失数据?

首先我们要了解的是message delivery semantic 也就是消息传递语义。

这是一个通用的概念,也就是消息传递过程中消息传递的保证性。

分为三种:

  • 最多一次(at most once):

    消息可能丢失也可能被处理,但最多只会被处理一次。
    可能丢失 不会重复

  • 至少一次(at least once): 消息不会丢失,但可能被处理多次。
    可能重复 不会丢失

  • 精确传递一次(exactly once): 消息被处理且只会被处理一次。

    不丢失 不重复 就一次

而kafka其实有两次消息传递,一次生产者发送消息给kafka,一次消费者去kafka消费消息。

两次传递都会影响最终结果,

两次都是精确一次,最终结果才是精确一次。

两次中有一次会丢失消息,或者有一次会重复,那么最终的结果就是可能丢失或者重复的。

分布式存储

producer 端

幂等的producer(idempotent producer)

Kafka 的 ISR 机制

所以如果要让写入 Kafka 的数据不丢失,你需要保证如下几点:

  • 每个 Partition 都至少得有 1 个 Follower 在 ISR 列表里

  • 每次写入数据的时候,都要求至少写入 Partition Leader 成功,同时还有至少一个 ISR 里的 Follower 也写入成功,才算这个写入是成功了。

如果不满足上述两个条件,那就一直写入失败,让生产系统不停的尝试重试,直到满足上述两个条件,然后才能认为写入成功。

按照上述思路去配置相应的参数,才能保证写入 Kafka 的数据不会丢失。

参考文献