当前位置:   article > 正文

我对Kafka高性能的四个关键点的理解_kafka技术关键点

kafka技术关键点
kafka是什么, 消息队列, 承载着广播、异步、解耦、削峰的重要特性.

kafka本质是个消息队列, 除了常见的性能优化手段外, kafka能在一众消息队列中脱颖而出, 拥有那些独特的必杀技呢? 

常见的性能优化手段, 无外乎有全异步化的线程模型、高性能的异步网络传输、自定义的私有传输协议以及序列化与反序列化等, 这些在kafka中也一一有对应的实现, 但这些还不够, kafka还加了顺序读写、消息批处理、零拷贝、pagecache页缓存四项核心技术.

磁盘顺序读写, 省去寻址耗时, 一次寻址, 持续写入或读取, 提升磁盘IO性能

顺序读写, 每个日志段都从一个位置开始写入,只需要寻址一次就可以持续写入, 省去了磁盘IO的耗时大头: 寻址时间, 基于这个特性, Kafka的存储读写就使用顺序读写技术. 在写入时, 对于每个分区, kafka会将消息追加到日志上, 持续追加到一个日志段的最新位置上, 当一个日志满了, 再开辟一个新的日志, 继续顺序写下去. 类似的, 在消费时, 消费者也是从某个log文件的一个位置开始, 持续读取数据. 

页缓存, 减少磁盘IO操作, 提升磁盘读写性能

页缓存是操作系统为磁盘建立的缓存, 无论使用什么程序语言, 应用程序的磁盘IO都是与pagecache打交道, 而尽可能的避免做直接磁盘IO读写操作, 通过缓存技术实现磁盘IO操作的异步化.

写入时, 数据写入到pagecache中, 对于用户而言, 其写入操作就结束了. 然后操作系统会定期将缓存中的数据更新到磁盘上. 

同时kafka的读写比例大概是1:1, 一发一收, 消息在broker上积压太久,  根据局部性原理, 写入的数据放在pagecache, 不就后就会被消费, 消费的消息也在pagecache上, 其命中率较高.

只读缓存和读写缓存的区别?为什么kafka使用pagecache这种读写缓存? 

  • 只读缓存面向读多写少的场景, 数据在首次读取需要从磁盘加载到缓存中后, 后续数据的读取可以直接从缓存中完成, 从而减轻IO的压力. 
  • 读写缓存在数据写入时会先写入缓存中,用户的写入工作就完成了,这样用户程序不用直接与磁盘打交道, 然后由磁盘定期刷新到磁盘中, 这种模式不适合与读多写少的业务,因为读写缓存在数据可靠性性上天然具备劣势, 若设备宕机,写入缓存中的数据就丢失了,同时在并发场景下还需要考虑异步数据写入的一致性, 其实现机制变得比较复杂.  
    • 读写缓存适配于消息队列这种读写比例大致为1:1的场景, 消息一发一收, 一般只会读写一次, 如果使用只读缓存, 其加速效果极为有限, 同时读写缓存的可靠性问题kafka使用了备份机制来解决, 同时pagecache是系统自带, 也无需自己实现, 所以在使用上, kafka通过巧妙的设计来避开了读写缓存的劣势, 而引入其在性能上的助益.
  • 缓存的其他的问题: 
    • 数据保鲜问题?
      • 只读缓存下, 缓存因未及时同步磁盘的最新数据, 可能出现滞后性, 也是一种数据不一致, 常见的优化手段包括写更新(写入异步更新缓存)、定期同步、过期时间设置, 后两者都存在着一定的延时, 在等待更新期间缓存的数据可能不是最新的, 但其实现简单,适合于在容忍一定延时的场景如头像置换等使用
    • 数据置换策略? 
      • 为什么要置换? 因为缓存是有限的,当满了后需要对数据进行清理, 那么清理那些数据呢? 不重要的、低频的、过期的, 可以是业务上判断的如离线用户数据、或可判断的过期数据, 但有种通用的最简答的策略LRU,最近最少使用策略, pagecache就是这种策略,  能够实现缓存较大的命中率, 
      • 缓存未命中直接访问磁盘的场景被称为"缓存穿透".
零拷贝, 减少冗余数据复制流程, 提升消费者性能

零拷贝也是操作系统提供的一种数据读写技术, 将数据从磁盘到网络传输的搬运全都在内核空间中完成, 避免从内核空间到用户空间冗余且需要CPU参与的数据拷贝动作, 从而提升性能. 

批量操作技术, 辅以异步化, 提升消费与生产的消息性能, 同时减轻broker的压力, 提升负载

一次传输30条数据肯定比分30次传输30条数据效率要高的多, 避免减少了网络IO交互的频率, 也可以通过数据压缩等各种优化手段对数据进行优化处理, kafka在对数据的读写都采取了批处理技术, 同时批处理也是一种异步化的技术. 即: 在生产端,数据调用mafka的接口做消息发送, 但这条消息实际上并不会被真正的发送给服务端, 而是producer端先攒着, 等攒够了批处理的量才会被发送处理, 这实际上就是一种缓存加异步化的技术, 和页缓存的写没有本质的区别. 类似的消息消费, 数据一次拉取也是一批数据, 就类似于pagecache的预读特性, 每次加载一批数据, 然后缓存在消费者客户端, 从而减少网络IO的动作. 总体来说kafka的批处理技术不仅体现在网络IO上, 还有磁盘IO上, 消息的批量消费与生产大大的减轻了broker处理请求的次数, 比如处理一次新的网络请求的线程上下文切换的消耗或在网络中的耗时等, 从而提升了整体的吞吐量与处理能力.

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号