Kafka是大型架构的必备中间件,下面我重点来详解Kafka如何实现高并发@mikechen
Kafka高并发核心设计
Kafka 的高并发能力并非单一技术的功劳,而是多种设计思想和技术的有机结合。
其分布式架构为横向扩展提供了基础,而高效的消息存储和传输机制,则直接提升了系统的吞吐量、和并发处理能力。
Kafka 通过将多个 Broker 组成集群的方式,实现了服务的横向扩展。
当数据量和并发请求增加时,可以简单地增加 Broker 节点来分摊压力,提高整体的处理能力和容错性。
每个 Topic 可以被划分为多个独立的分区,每个分区可以存储在不同的 Broker 上。
这使得同一个 Topic 的消息能够被并行地写入和读取,极大地提高了吞吐量。
顺序写入
Kafka 的每个分区在物理磁盘上,以日志(Log)文件的形式存储消息。
如下图所示:
新的消息总是被追加到日志文件的末尾,这是一个纯粹的顺序写入操作。
相比随机写入,顺序写入的性能提升非常显著,尤其是在机械硬盘上。
顺序写入避免了磁盘磁头的随机寻道,将大部分时间都用于数据传输,极大地提高了磁盘的写入效率。
消息压缩
生产者在发送消息之前,可以使用各种压缩算法,对消息进行压缩,减小消息的体积。
压缩后的消息体积更小,在网络传输过程中占用的带宽更少,这在高并发场景下尤为重要,可以避免网络成为瓶颈。
比如:
GZIP:压缩比高,适合对传输体积要求高的场景;
Snappy:压缩速度快,Kafka 默认推荐;
LZ4:兼顾压缩比和速度;
ZSTD:新兴算法,压缩效率极高。
发送端异步机制
Kafka 生产者采用异步发送机制,发送消息时不阻塞等待 Broker 确认。
在异步模式下,生产者将消息放入一个缓冲区(Buffer),然后由后台线程批量地将缓冲区中的消息发送给 Broker,而无需等待 Broker 的响应。
异步发送允许生产者在等待 Broker 响应之前继续发送下一条消息,极大地提高了发送端的吞吐量。
并且,生产者无需等待每个消息的确认,从而降低了单个消息的发送延迟。
页缓存技术
Kafka 并非频繁调用磁盘写入,而是借助 Linux 系统的页缓存机制,将数据先写入内存页缓存,系统再异步刷盘。
页缓存:是操作系统内核,为了优化文件 I/O 而采用的一种技术。
大致流程,如下:
Producer 将消息写入 Kafka;
Kafka 将消息追加写入 log 文件;
实际写入通过 Page Cache,由 OS 控制磁盘刷写节奏;
Kafka 提供 log.flush.interval
控制强制刷盘时机。
Kafka Broker 将消息数据存储在磁盘上,当消费者需要读取消息时,操作系统会将磁盘上的日志文件内容加载到页缓存中。
由于大部分的读操作都可以直接从内存的页缓存中完成,这极大地提高了读取性能,降低了磁盘 I/O 的压力。
总之,Kafka 实现高并发并非依赖于单一的技术,而是巧妙地结合了分布式架构、高效存储机制以及一系列性能优化手段。