kafka优点
了解kafka的架构、生产者、消费者、topic与partition等基本概念后,无论我们是否对kafka的实现是否了解,都曾经看到过或自行了解过kafka有以下优点:
- 高吞吐量、低延迟。即使在非常廉价的机器上,Kafka也能做到每秒处理几十万条消息,而它的延迟最低只有几毫秒
- 持久性。Kafka可以将消息直接持久化在普通磁盘上,且磁盘读写性能优异。
- 容错性。Kafka会将数据备份到多台服务器节点中,即使Kafka集群中的某一台Kafka服务节点宕机,也不会影响整个系统的功能。
- 扩展性。Kafka集群支持热扩展,Kaka集群启动运行后,用户可以直接向集群添加实例。
- 解耦。Kafka具备消息系统的优点,只要生产者和消费者数据两端遵循接口约束,就可以自行扩展或修改数据处理的业务过程。
- 支持多种客户端语言。Kafka支持Java、.NET、PHP、Python等多种语言。
本文主要介绍kafka的这些优点是如何实现的,一遍我们更加深入的理解kafka.
kafka源码github地址:https://github.com/apache/kafka
高吞吐、低延时
相比于rocketMQ十万级的tps,kafka能打到百万级别的tps,其主要因为kafka再各个层面的策略与优化相关,其主要优化有以下几点:
- 顺序读写
- PageCache进行读写缓存。
- ZeroCopy操作系统层面的零拷贝。
- 分区分段与索引
- 批量读写
- 批量压缩
顺序读写
Kafka与RocketMQ一样都是将消息存储在磁盘上的,但是读写速度依然很快,这与其都是用顺序读写有关,实际上不管是内存与磁盘,快或慢的关键在于寻址方式,都存在顺序读写与随机读写两种方式,虽然磁盘随机读写很慢,但是磁盘的顺序读写性能很高。
Kafaka通过顺序读写将消息messaga追加到本地磁盘文件的末尾,使得kafka的吞吐量得到很大提升,kafka的每个parttion其实都是一个文件,收到消息时会把数据追加到文件的末尾,同时由于顺序读写的原因,kafka时不会删除数据的(高版本已支持,低版本主要处于删除成本考虑),会把所有数据保留下来,而每个消费者consumer会对每一个topic维护一个偏移量的offset用来表示读取到的位置。
kafka虽然不删除数据,但提提供了两种策略来清理数据,分别是基于时间与partition文件大小的策略,可自行查略资料了解。
PageCache
PageCache是针对文件系统中文件的缓存,不了解的同学可先了解其原理。Kafka正是利用了PageCache提高了数据读写的性能,相比于使用JVM的空间内存,有以下好处:
- 避免Object消耗:如果是jvm内存,需要创建对象,java对象除了数据外,还需要存储一些对象信息,内存消耗比较大,通常是所存数据的两倍以上。
- 避免垃圾回收GC问题,熟悉jvm的同学应该知道,随着jvm中对象数据不断增加,垃圾回收可能会变得比较慢,且比较复杂,而使用系统缓存就不存在GC问题。
除此之外,相比于JVM缓存或in-memory cache其次,操作系统本身也对于Page Cache做了大量优化,提供了 write-behind、read-ahead以及flush等多种机制。再者,即使服务进程重启,系统缓存依然不会消失,避免了in-process cache重建缓存的过程。通过操作系统的Page Cache,Kafka的读写操作基本上是基于内存的,读写速度得到了极大的提升。