Kafka 是一个分布式流媒体平台,支持高吞吐量、高度分布式、容错和低延迟的消息传递的中间件.

让我们了解是什么让 Kafka 如此之快的原因?

低延迟 IO:

在消息传递中实现低延迟的传统方法之一是通过随机存取存储器 (RAM)。虽然这种方法使它们速度很快,但 RAM 的成本远高于磁盘。当您有数百 GB 的数据时,这样的系统通常运行成本更高。Kafka 依赖磁盘进行存储和缓存。但问题是,磁盘比 RAM 慢。它通过顺序 IO 实现了与随机存取存储器 (RAM) 一样的低延迟。

什么是顺序 IO?

这是一个很好的类比,它以更简单的方式解释了顺序 IO

顺序IO是指读写操作的访问地址连续。在顺序IO访问中,HDD所需的磁道搜索时间显着减少,因为读/写磁头可以以最小的移动访问下一个块。数据备份和日志记录等业务是顺序IO业务。
随机IO是指读写操作时间连续,但访问地址不连续,随机分布在磁盘的地址空间中。产生随机IO的业务有OLTP服务,SQL,即时消息服务等。

Mysql 数据最终都会刷到磁盘上去,刷盘分随机IO和顺序IO,两者性能相差很大,大多情况下我们会改变一下设计使Mysql 的随机IO变为顺序IO来提高性能

零 - 复制主体。

描述了 CPU 不 执行将数据从一个  内存 区域复制到另一个内存区域的任务的计算机操作。这经常用于在通过网络传输文件时节省 CPU 周期和内存带宽。让我们用一个简单的例子来看看这个概念。让我们考虑一种传统的文件传输方式。当客户端从静态网站请求文件时。首先,网站静态文件从磁盘读取并将完全相同的文件写入响应套接字。这是一个非常低效的活动,尽管它看起来是因为 CPU 在这里没有执行太多活动。

内核从磁盘读取数据并将其跨内核用户边界推送到应用程序,然后应用程序将其跨内核用户边界推送回以写出到套接字。实际上,应用程序充当一个低效的中介,将数据从磁盘文件获取到套接字。

传统数据复制方法

每次超出用户边界内核的数据传输都会消耗CPU周期和内存带宽,导致性能下降,尤其是在数据量很大的时候。这正是零拷贝主体 所要解决的问题。

Kafka 通过请求内核将数据移动到套接字而不是通过应用程序移动来利用这种零拷贝原则。

零拷贝大大提高了应用程序性能,减少了内核态和用户态之间的上下文切换次数。
kafka 零拷贝 方法。

还有什么?

除了上述技术之外,Kafka 还使用了许多其他技术来使系统更快、更高效的原因还有如下:

  1. 批处理数据以减少网络调用,并将大量随机写入转换为顺序写入。
  2. 使用LZ4、  SNAPPY或 GZIP编解码器压缩批次(而不是单个消息)
  3. 许多数据在批次中的消息之间是一致的(例如,消息字段和元数据信息)。这可以导致更好的压缩比。