Kafka是大型架构的核心,下面我重点详解Kafka亿级消息技术@mikechen
分区水平扩展
Kafka 的 Topic 可以划分为多个 分区(Partition),分布在不同的 Broker 节点上。
Producer 写入时,可以按照 Key 或随机策略 将消息分配到不同分区。
通过增加分区数量和 Broker 节点,Kafka 能将负载横向分配至更多存储与计算资源,从而线性提升吞吐能力。
生产者按分区选择策略(如轮询或基于 key 的哈希),将消息分散到不同分区。
消费者组内的消费者则并行消费不同分区,实现消费端的扩展。
顺序写优化
Kafka 的消息存储是 追加写日志文件(Append Only Log)。
磁盘的 顺序写 性能比随机写高几个数量级,几乎接近内存。
Kafka 借助 Linux Page Cache:消息先写入内存缓冲区,再由操作系统批量刷盘。
优势:消除了频繁随机写磁盘的开销。
批量刷盘减少了 I/O 系统调用,提高吞吐率。
类比:就像在日记本最后一页一直往下写,而不是不停翻页找地方记录。
零拷贝
零拷贝技术是 Kafka 实现高吞吐量读取的关键,它优化了数据在网络传输过程中对 CPU 的消耗。
核心原理:绕过应用层 CPU 拷贝。
传统 I/O 瓶颈: 在没有零拷贝的情况下,消息从磁盘文件发送到网络通常需要经过 4 次数据拷贝和多次上下文切换(内核态 用户态)。
零拷贝优化: Kafka 利用 Linux 内核提供的 sendfile()
或 transferTo()
等系统调用。
数据从磁盘直接传输到 内核 Socket 缓冲区。
整个过程跳过应用程序用户空间,避免了不必要的 CPU 介入和内存拷贝。
批量处理
Kafka 通过批量处理消息来分摊固定开销,从而提高系统的整体效率。
生产者,不会为每一条消息都发送一个独立的网络请求。
它会在本地将多条消息打包成一个消息批次(Batch),然后一次性发送给 Broker。
整个消息批次可以在发送前进行压缩(如 Snappy, Gzip, LZ4 等)。Broker 收到后,以压缩格式写入磁盘。
这样,极大减少了网络传输的数据量和磁盘 I/O 负载。