kafaka
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 的数据不会丢失。