翻译总结一下kafka的设计思路:Kafka Design
4.1 动机
4.2 持久化
不要害怕硬盘
- 顺序读写硬盘效率并不低,能达到600M/s;随机读写硬盘才低效,一般100K/s。相差近6000倍
- 现代的操作系统,文件系统都是有缓存的。如果不强行执行flush操作,我们的写都是直接写到文件系统缓存中,这个过程是非常迅速的。之后操作系统会按照某种策略异步的将文件系统缓存真正的写入硬盘。
常数时间操作
我们对kafka的大部分操作都是顺序写和顺序读,这是O(1)的。
4.3 高性能
-
顺序读写硬盘
-
batch操作
-
producer端以batch的操作减少请求的次数
-
broker端以batch的操作接受并写入硬盘。相比与数量较大的小文件,写数量较小的大文件时,更有力于发挥顺序写的优势。(文件大,文件数少,相同partition的情况下,换道次数更少,每次换道顺序写的时间更长,性能更高。)
-
零拷贝
-
broker端正常的一次consumer poll过程是要经过:磁盘-》文件系统缓存(内核)-》用户空间buffer-》socket buffer(内核空间)-》网卡。经历了4次copy和两次操作系统的切换。
-
kafka的broker端不需要在用户态对数据进行处理,因此通过操作系统的sendfile函数优化为:磁盘-》文件系统缓存-》网卡。减少了2次copy和2次切换。
-
且由于kafka是多consumer group的,因此其他consumer group再次进行poll操作时直接发送网卡即可。
-
数据压缩
-
很多情况下,瓶颈往往在网络带宽上。
-
端对端:kafka天然的支持数据压缩。producer端压缩,consumer端进行解压缩。broker端不需要任何处理,存储的既是压缩后的数据。
-
批量压缩:单条消息的压缩比往往不高(数据本身太小,且重复性太小)。而kafka中消息的发送是batch发送的,因此压缩也是batch压缩,压缩比要好很多。
4.4 生产者
负载均衡
-
kafka producer发送消息是直接发送到对应的partition的leader所在的broker的。
-
因此producer访问任意broker,该broker都能告诉该producer关于全部partition的信息。
-
kafka producer端可以自定义选择partition的策略。
-
比如根据key进行hash,对partition取模。
异步批量发送
kafka producer发送消息是异步的,批量的。
4.5 消费者
未完待续。。。