面试必问,Kafka为啥速度快

Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。

Kafka的使用场景:
日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。消息系统:解耦和生产者和消费者、缓存消息等。用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。流式处理:比如spark streaming和storm事件源
 


Kafka为啥速度快

大家皆知kafka是分布式部署具有高可用性,brokers集群制+partition分区模式提升了容灾能力
,数据是存储在磁盘上确保了数据的持久化。Redis速度快是因为其基于内存存储实现的数据库,
内存读写省去了磁盘I/O的消耗,所以会很快,但是kafka是基于磁盘存储的,为啥具有高吞吐量呢
 

一,顺序写入+mmfile
    1、顺序写入
    硬盘是机械结构,每次读写都会寻址->写入,其中的寻址操作是最耗时的,所以顺序读写就可以规避
    随机I/O的寻址操作,其顺序读写速度与内存基本可持平。
    对于java的面向对象开发,内存开销是很大的,且随着堆内存数据的增多,java的gc时间会变长,
    使用磁盘操作的好处就出来了:
    ① 顺序写入磁盘顺序读写速度超过内存随机读写
    ② 顺序写入 JVM 的 GC 效率低,内存占用大。使用磁盘可以避免这一问题
    ③ 顺序写入系统冷启动后,磁盘缓存依然可用

     

    2、mmfile(Memory Mapped Files)
    磁盘和内存在读写上有天然的差距,顺序读写也不一定能追的上内存,所以
    kafka充分利用了现代操作系统分页存储来利用内存提高 I/O 效率


二:基于sendFile实现零拷贝
传统模式的拷贝方案:硬盘—> 内核 buf—> 用户 buf—>socket 相关缓冲区—> 协议引擎
零拷贝方案:硬盘—> 内核 buf—>socket 相关缓冲区—> 协议引擎
省去了内核缓冲区到 user 缓冲区,再由 user 缓冲区到 socket 相关缓冲区的文件 copy


三:批量压缩
大多情况下,系统的瓶颈是网络I/O,而不是cpu或磁盘,kafka作为高吞吐量的流式处理系统,
网络I/O速度尤为重要
1、如果每个消息都压缩,但是压缩率相对很低,所以 Kafka 使用了批量压缩,即将多个消息
一起压缩而不是单个消息压缩
2、Kafka 允许使用递归的消息集合,批量的消息可以通过压缩的形式传输并且在日志中也
可以保持压缩格式,直到被消费者解压缩
3、Kafka 支持多种压缩协议,包括 Gzip 和 Snappy 压缩协议


总结
Kafka 速度的秘诀在于,它把所有的消息都变成一个批量的文件,并且进行合理的批量压缩,
减少网络 IO 损耗,通过 mmap 提高 I/O 速度,写入数据的时候由于单个 Partion 是末尾
添加所以速度最优;读取数据的时候配合 sendfile 直接暴力输出
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值