Kafka是大型架构的必备中间件,下面我重点来详解Kafka写入原理@mikechen
Kafka
Apache Kafka 是一个高吞吐、可扩展、分布式的消息队列系统。
最初用于处理LinkedIn的活动流、和运营数据,现已广泛应用于实时日志分析、流处理…….等场景。
Kafka写入原理
在处理海量实时数据流的场景下,高吞吐量是 Kafka 的核心竞争力。
高效的写入能力,直接决定了 Kafka 能否支撑大规模的数据采集、和传输需求。
所以,要想掌握好Kafka,你需要深入理解Kafka的写入机制。
Kafka 的消息是顺序追加到日志文件中的(.log
文件),写入时不需要在文件中查找位置或修改已有内容。
传统的机械磁盘(HDD)的读写速度,受到多个物理因素的限制。
举一个例子,比如:寻道时间 (Seek Time), 磁头移动到目标磁道所需的时间,这是最耗时的操作。
随机写入操作需要磁头频繁地移动到不同的磁道和扇区,导致大量的寻道时间和旋转延迟,从而显著降低了写入性能。
相比之下,顺序写入操作磁头只需要很少的移动,甚至不需要移动,数据可以连续地写入相邻的扇区,极大地提高了写入效率。
当 Producer 发送消息到 Kafka Broker 的某个 Partition 时,Broker 会将这些消息顺序地追加到该 Partition 对应的日志文件 (Log File) 的末尾。
新的消息总是被写入到文件的尾部,而不是文件的中间或随机位置。
虽然 Kafka 的写入是顺序的,但为了保证读取性能,Kafka 还采用了缓存策略。
Kafka 的写入并不是直接把消息同步写入磁盘(调用 fsync
),而是借助操作系统的页缓存(Page Cache),实现顺序写 + 异步落盘机制,从而达到性能与可靠性的平衡。
页缓存是操作系统提供的一种文件系统级缓存机制。当进程通过 write()
系统调用写入文件时,数据先被写入内核内存中的页缓存,再由操作系统异步写入磁盘。
流程,如下所示:
Producer ↓ Kafka Broker 接收数据 ↓ 写入 Partition 对应的 LogSegment(*.log) ↓ 调用 Java FileChannel → mmap/buffer → write() ↓ 数据写入 OS 页缓存(Page Cache) ↓ (异步)落盘 → 磁盘(fsync / flush / 内核调度)
当 Broker 将消息写入磁盘时,数据首先会被写入到 Page Cache 中。
然后由操作系统异步地将数据刷写到物理磁盘。这种延迟写入的方式可以提高写入吞吐量。