Kafka~高吞吐量设计

Kafka 之所以能够实现高性能和高速度,主要归因于以下几个关键因素:

  1. 分布式架构:Kafka 采用分布式架构,可以水平扩展,通过增加服务器节点来处理更多的流量和数据存储。
  2. 顺序写入磁盘:Kafka 将消息顺序地写入磁盘,这种顺序写入相比随机写入磁盘的性能要高得多。磁盘顺序读写的速度接近于内存的读写速度。
  3. 分区机制(稀疏索引):数据被分割到多个分区,不同分区可以并行处理,从而提高了并发处理能力,并按照数据量级间隔建立索引。
  4. 批量处理:Kafka 会对消息进行批量处理,而不是逐个处理消息,减少了网络开销和磁盘 I/O 次数。
  5. 零拷贝技术:在数据传输过程中,使用零拷贝技术避免了不必要的数据复制,提高了数据传输效率。
  6. 内存映射:通过内存映射文件(Memory Mapped Files),将磁盘文件映射到内存,加快了数据的访问速度。
  7. 高效的存储格式:Kafka 采用紧凑的二进制存储格式,减少了存储空间的占用,并且有利于数据的快速读取和处理。
  8. 预读和后写优化:利用磁盘的预读和后写特性,提前读取后续可能需要的数据,以及延迟写入以合并更多的操作。

我挑几个比较重要的讲一讲。

发送批量处理

  1. 批量发送:Kafka通过将多个消息打包成一个批次,减少了网络传输和磁盘写入的次数,从而提高了消息的吞吐量和传输效率。详细可以看我之前的文档-消息写入过程
  2. 异步发送:生产者可以异步发送消息,不必等待每个消息的确认,这大大提高了消息发送的效率。
  3. 消息压缩:支持对消息进行压缩,减少网络传输的数据量。
  4. 并行发送:通过将数据分布在不同的分区(Partitions)中,生产者可以并行发送消息,从而提高了吞吐量。

数据高效存储

  1. 零拷贝技术:Kafka使用零拷贝技术来避免了数据的拷贝操作,降低了内存和CPU的使用率,提高了系统的性能。

如果不考虑用户态的内存拷贝和物理设备到驱动的数据拷贝,一次数据读取IO会涉及4次数据拷贝。同时也会涉及到4次进程上下文的切换。所谓的零拷贝,作用就是通过各种方式,在特殊情况下,减少数据拷贝的次数/减少CPU参与数据拷贝的次数

常见的零拷贝方式有mmap、sendfile、dma、directl/O等。

  1. 磁盘顺序写入:Kafka把消息存储在磁盘上,且以顺序的方式写入数据。顺序写入比随机写入速度快很多,因为它减少了磁头寻道时间。避免了随机读写带来的性能损耗,提高了了磁盘的使用效率。
  2. 页缓存:Kafka将其数据存储在磁盘中,但在访问数据时,它会先将数据加载到操作系统的页缓存中,并在页缓存中保留一份副本,因为MQ大多是顺序读操作,从而实现快速的数据访问。
  3. 稀疏索引 :Kafka存储消息是通过分段的日志文件,每个个分段都有自己的索引文件。这些索引文件中的条目不是对分段中的每条消息都建立索引,而是每隔一定数量的消息建立一个索引点 ,这就构成了稀疏索引。稀疏索引减少了索引大小,使得加载到内存中的索引更小,提高了查找特定消息的效率
  4. 分区和副本:Kafka采用分区和副本的机制,可以将数据分散到1多个节点上进行处理,从而实现了分布式的高可用性和负载均衡。

并行消费

  1. 并行消费:不同的消费者可以独立地消费不同的分区,实现消费的并行处理。
  2. 批量拉取:Kafka支持批量拉取消息,可以一次性拉取多个消息进行消费。减少网络消耗,提升性能。
相关推荐
敏叔V5872 小时前
联邦学习与大模型:隐私保护下的分布式模型训练与微调方案
分布式
短剑重铸之日3 小时前
《7天学会Redis》特别篇: Redis分布式锁
java·redis·分布式·后端·缓存·redission·看门狗机制
重生之绝世牛码5 小时前
Linux软件安装 —— kafka集群安装(SASL密码验证)
大数据·linux·运维·服务器·分布式·kafka·软件安装
填满你的记忆6 小时前
【从零开始——Redis 进化日志|Day5】分布式锁演进史:从 SETNX 到 Redisson 的完美蜕变
java·数据库·redis·分布式·缓存
無森~6 小时前
ZooKeeper
分布式·zookeeper·云原生
小北方城市网6 小时前
SpringBoot 集成 MinIO 实战(对象存储):实现高效文件管理
java·spring boot·redis·分布式·后端·python·缓存
Blossom.1186 小时前
大模型分布式训练通信优化:从Ring All-Reduce到分层压缩的实战演进
人工智能·分布式·python·深度学习·神经网络·机器学习·迁移学习
谷新龙0017 小时前
kafka工作原理
kafka
码农水水7 小时前
得物Java面试被问:大规模数据的分布式排序和聚合
java·开发语言·spring boot·分布式·面试·php·wpf
爱吃提升7 小时前
分布式爬虫的核心原理详细介绍
分布式·爬虫