• Kafk为什么这么快


    主要基于从kafka0.11.0版本开始之后的版本进行描述

    1、批处理
    传统消息中间件,一次只发送单挑消息;kafka,一次发送多条消息,微批处理。

    生产者发送消息,需要2次rpc:
             发送消息;
             broker返回ACK信号,表示已经接收消息;
    消费者消费消息,3次rpc:
             消费者请求接收消息;
             broker返回消息;
             消费者返回ACK信号,表示已经消费
    
    

    2、客户端优化
      新版客户端摒弃单线程,采用双线程模式——主线程+Sender线程。
      主线程负责将消息置入客户端缓存(缓存会将多个消息聚合为1个批次);Sender线程将缓存中聚合好的批次消息发送到Broker。

    3、日志消息格式设计优良
    新版本(从kafka 0.11.0版本开始)的日志消息格式,引用了变长字段Varints和ZigZag编码,有效降低了附加字段占用的空间,降低了网络传输、日志存盘占用开销。

    4、消息压缩
      Kafka支持多种消息压缩方式(gzip、snappy、lz4)。对消息进行压缩可以极大地减少网络传输 量、降低网络 I/O,从而提高整体的性能。消息压缩是一种使用时间换空间的优化方式,如果对 时延有一定的要求,则不推荐对消息进行压缩。

    5、分区
    kafak对消息进行分区,提高了数据生产与消费的并行度,有效的提升了数据的吞吐量。

    注:一昧地增加分区并不能一直带来性能的提升,详细参考[Kafka主题中的分区数越多吞吐量就越高](https://mp.weixin.qq.com/s?__biz=MzU0MzQ5MDA0Mw==&mid=2247484320&idx=1&sn=eee3caea1f28b180cf68d3469bb7d4f2&chksm=fb0be934cc7c6022cd2244ceb58b821d3fe0dc518eca1b29c4764f7d42cf2627a418bfbbf9f2&scene=21#wechat_redirect)
    

    6、索引
    kafka为每个日志分段文件提供了2个索引文件(偏移量索引文件.index、时间戳索引文件.timeindex),提高了消息的查询效率

    7、顺序写盘
    Kafka 在设计时采用了文件追加的方式来写入消息,即只能在日志文件的尾部追加新的消息,并且也不允许修改已写入的消息,这种方式属于典型的顺序写盘的操作,而操作系统可以针对线性读写做深层次的优化,比如预读(read-ahead,提前将一个比较大的磁盘块读入内存) 和后写(write-behind,将很多小的逻辑写操作合并起来组成一个大的物理写操作)技术,所以就算 Kafka 使用磁盘作为存储介质,它所能承载的吞吐量也不容小觑。

    8、页缓存
      Kafka 中大量使用了页缓存,这是 Kafka 实现高吞吐的重要因素之一。
      页缓存是操作系统实现的一种主要的磁盘缓存,采用页缓存的主要优点:

       (1)减少对磁盘 I/O 的操作(具体来说,就是把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问)
       (2)维护页缓存和文件之间的一致性交由操作系统来负责,比进程内维护更加安全有效
    

    8、零拷贝
    Kafka使用了Zero Copy技术提升了消费的效率。前面所说的Kafka将消息先写入页缓存,如果消费者在读取消息的时候如果在页缓存中可以命中,那么可以直接从页缓存中读取,这样又节省了一次从磁盘到页缓存的copy开销。

    什么是Zero-Copy?

    附录:
    (1)磁盘IO流程图

    参考:
    (1)https://mp.weixin.qq.com/s/G5nfLpPOr80pk1sHzrLuOA

  • 相关阅读:
    【从零开始学Java笔记】学生管理系统
    【从零开始学Java笔记】关键字super和this
    【从零开始学Java笔记】关键字Static
    【从零开始学Java笔记】关键字final
    【从零开始学Java笔记】关键字abstract
    循环结构
    switch选择结构
    if条件语句
    位运算
    Eclipse 报错The method xxx of type must override a superclass method、Description Resource Path Location Type Java compiler level does not match the version of the installed Java project facet
  • 原文地址:https://www.cnblogs.com/hxuhongming/p/12817378.html
Copyright © 2020-2023  润新知