深入理解Kafka

kafka优点

了解kafka的架构、生产者、消费者、topic与partition等基本概念后,无论我们是否对kafka的实现是否了解,都曾经看到过或自行了解过kafka有以下优点:

  1. 高吞吐量、低延迟。即使在非常廉价的机器上,Kafka也能做到每秒处理几十万条消息,而它的延迟最低只有几毫秒
  2. 持久性。Kafka可以将消息直接持久化在普通磁盘上,且磁盘读写性能优异。
  3. 容错性。Kafka会将数据备份到多台服务器节点中,即使Kafka集群中的某一台Kafka服务节点宕机,也不会影响整个系统的功能。
  4. 扩展性。Kafka集群支持热扩展,Kaka集群启动运行后,用户可以直接向集群添加实例。
  5. 解耦。Kafka具备消息系统的优点,只要生产者和消费者数据两端遵循接口约束,就可以自行扩展或修改数据处理的业务过程。
  6. 支持多种客户端语言。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文件大小的策略,可自行查略资料了解。

image.png

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的读写操作基本上是基于内存的,读写速度得到了极大的提升。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值