Kafka 吞吐为什么高

简介

Kafka 是一个分布式流处理平台。

适用场景

  • 消息系统:消息队列解耦生产者和消费者等
  • 流式处理:以高容错,低延迟的方式存储,处理实时流式数据
  • **存储系统: **数据存储在磁盘上

架构图

kafka-archicture

设计要点

  1. topic and partition
    1. producer 发送到 kafka server 的消息以 topic 分组,consumer 可以按照 topic 来订阅消费某类型的消息数据
    2. topic 在 kafka server 内细分多个 partition 存储消息,每个消息在 partition 内部都是有序的,并且会有个 位置标识,也叫 offset
    3. 每个 consumer 消费消息的同时,会往metadata 里面存储当前 consumer 消费过的消息的 offset。这也使得 consumer 可以从任意的 offset 来消费消息,并且多个消费者之间是互不影响的
  2. 顺序读写,提高硬盘的读写速度
    1. 硬盘是机械结构,每次读写都会 寻址 → 写入,寻址是一个耗时的动作,顺序写入寻址的时间会比随机写入快的多
    2. topic 里的每个 partition 其实都是一个文件,kafka 将消息顺序存储 append 到 partition 文件的末尾
  3. Memory Mapped Files (mmap)
    1. 即使是顺序写入磁盘,硬盘的访问速度也比不上内存。所以kafka 的数据并不是实时的写入磁盘。它充分利用了现代操作系统 page cache 来利用内存提高I/O效率。
    2. mmap(内存映射文件),在64位操作系统中一般可以表示20G的数据文件,它的工作原理是直接利用操作系统的Page来实现文件到物理内存的直接映射。完成映射之后你对物理内存的操作会被同步到硬盘上(操作系统在适当的时候)。
    3. 通过mmap,进程像读写硬盘一样读写内存(当然是虚拟机内存),也不必关心内存的大小有虚拟内存为我们兜底。但也有一个很明显的缺陷——不可靠,写到mmap中的数据并没有被真正的写到硬盘,操作系统会在程序主动调用flush的时候才把数据真正的写到硬盘。
  4. 采用 Zero-Copy 提高发送性能
    1. 传统read/write方式进行网络文件传输的方式
      硬盘—>内核buf—>用户buf—>socket相关缓冲区—>协议引擎
    2. Zero-Copy 利用 sendfile 则减少多次copy拷贝,提升文件传输性能
      硬盘—>内核buf—>socket相关缓冲区—>协议引擎

总结

kafka 可以定位成一个文件存储系统

  • producer 发送的数据 可以被 topic + partition 分散到多个存储路径
  • cosumer 通过在 zokeeper 维护数据消费的 offset,可以从 kafka 任意位置开始,读取有序的数据
  • 数据的读取和写入不会互相阻塞,性能可以永远达到最大化