Kafka在提高效率方面做了很大努力。Kafka的一个主要使用场景是处理网站活动日志,吞吐量是非常大的,每个页面都会产生好多次写操作。读方面,假设每个消息只被消费一次,读的量的也是很大的,Kafka也尽量使读的操作更轻量化。

我们之前讨论了磁盘的性能问题,线性读写的情况下影响磁盘性能问题大约有两个方面:太多的琐碎的I/O操作和太多的字节拷贝。I/O问题发生在客户端和服务端之间,也发生在服务端内部的持久化的操作中。
消息集(message set)
为了避免这些问题,Kafka建立了“消息集(message set)”的概念,将消息组织到一起,作为处理的单位。以消息集为单位处理消息,比以单个的消息为单位处理,会提升不少性能。Producer把消息集一块发送给服务端,而不是一条条的发送;服务端把消息集一次性的追加到日志文件中,这样减少了琐碎的I/O操作。consumer也可以一次性的请求一个消息集。
另外一个性能优化是在字节拷贝方面。在低负载的情况下这不是问题,但是在高负载的情况下它的影响还是很大的。为了避免这个问题,Kafka使用了标准的二进制消息格式,这个格式可以在producer,broker和producer之间共享而无需做任何改动。
zero copy
Broker维护的消息日志仅仅是一些目录文件,消息集以固定队的格式写入到日志文件中,这个格式producer和consumer是共享的,这使得Kafka可以一个很重要的点进行优化:消息在网络上的传递。现代的unix操作系统提供了高性能的将数据从页面缓存发送到socket的系统函数,在linux中,这个函数是sendfile.
为了更好的理解sendfile的好处,我们先来看下一般将数据从文件发送到socket的数据流向:

  1. 操作系统把数据从文件拷贝内核中的页缓存中
  2. 应用程序从页缓存从把数据拷贝自己的内存缓存中
  3. 应用程序将数据写入到内核中socket缓存中
  4. 操作系统把数据从socket缓存中拷贝到网卡接口缓存,从这里发送到网络上。

这显然是低效率的,有4次拷贝和2次系统调用。Sendfile通过直接将数据从页面缓存发送网卡接口缓存,避免了重复拷贝,大大的优化了性能。
在一个多consumers的场景里,数据仅仅被拷贝到页面缓存一次而不是每次消费消息的时候都重复的进行拷贝。这使得消息以近乎网络带宽的速率发送出去。这样在磁盘层面你几乎看不到任何的读操作,因为数据都是从页面缓存中直接发送到网络上去了。
这篇文章详细介绍了sendfile和zero-copy技术在Java方面的应用。
数据压缩
很多时候,性能的瓶颈并非CPU或者硬盘而是网络带宽,对于需要在数据中心之间传送大量数据的应用更是如此。当然用户可以在没有Kafka支持的情况下各自压缩自己的消息,但是这将导致较低的压缩率,因为相比于将消息单独压缩,将大量文件压缩在一起才能起到最好的压缩效果。
Kafka采用了端到端的压缩:因为有“消息集”的概念,客户端的消息可以一起被压缩后送到服务端,并以压缩后的格式写入日志文件,以压缩的格式发送到consumer,消息从producer发出到consumer拿到都被是压缩的,只有在consumer使用的时候才被解压缩,所以叫做“端到端的压缩”。
Kafka支持GZIP和Snappy压缩协议。更详细的内容可以查看这里。

转载于:https://www.cnblogs.com/shijiaoyun/p/5053344.html

漫游Kafka设计篇之性能优化(7)相关推荐

  1. 漫游Kafka设计篇之性能优化

    原文地址:http://blog.csdn.net/honglei915/article/details/37564757 Kafka视频教程同步首发,欢迎观看! Kafka在提高效率方面做了很大努力 ...

  2. 漫游Kafka设计篇之数据持久化

    转载注明出处:http://blog.csdn.net/honglei915/article/details/37564595 Kafka视频教程同步首发,欢迎观看! 不要畏惧文件系统! Kafka大 ...

  3. 漫游Kafka设计篇之主从同步

    原文地址:http://blog.csdn.net/honglei915/article/details/37565289 Kafka视频教程同步首发,欢迎观看! Kafka允许topic的分区拥有若 ...

  4. 漫游Kafka设计篇之Producer和Consumer

    原文地址:http://blog.csdn.net/honglei915/article/details/37564871 Kafka视频教程同步首发,欢迎观看! Kafka Producer 消息发 ...

  5. 漫游Kafka设计篇之Producer和Consumer(4)

    Kafka Producer 消息发送 producer直接将数据发送到broker的leader(主节点),不需要在多个节点进行分发.为了帮助producer做到这点,所有的Kafka节点都可以及时 ...

  6. 漫游Kafka设计篇之消息传输的事务定义

    原文地址:http://blog.csdn.net/honglei915/article/details/37565119 之前讨论了consumer和producer是怎么工作的,现在来讨论一下数据 ...

  7. ensp大型网络环境设计与实现_mongodb内核源码设计实现、性能优化、最佳运维系列-网络传输层模块源码实现三...

    1. 说明 在之前的<<Mongodb网络传输处理源码实现及性能调优-体验内核性能极致设计>>和<<mongodb内核源码设计实现.性能优化.最佳运维系列-tran ...

  8. 性能优化系列第一篇——数据库性能优化

    本文章转载的Trinea大神的文章,文章原地址 http://www.trinea.cn/android/database-performance/ 性能优化之数据库优化 本文为性能优化的第一篇--数 ...

  9. HBase设计与开发性能优化(转)

    本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,这里涉及的不多,这部分可以参考:淘宝Ken Wu同学的博客. 1. 表的设计 1.1 Pr ...

最新文章

  1. Nature综述 | 种内多样性:解释微生物组中的菌株
  2. iptables为什么需要增加loopback回环的规则
  3. python条件控制语句_Python课堂笔记 条件控制语句
  4. SAP CRM中间件下载equipment时遇到的一个错误
  5. MVC实现实现文件流打包成压缩包
  6. tomcat使用ssl_使用SSL和Spring Security保护Tomcat应用程序的安全
  7. 原码、反码、补码,计算机中负数的表示
  8. Blas SGEMM launch failed
  9. 周末送新书 | 一文了解预训练语言模型!
  10. Nginx + Lua搭建文件上传下载服务
  11. BN层和Dropout层
  12. 北京54坐标系转换工具
  13. 浪潮华为,高端存储市场的双头之争
  14. 域名备案方法及是否需要备案
  15. QQ(腾讯)微云网盘快速上传,快速下载方案
  16. HBuilder的mui登录模板修改登录页为非入口页面的方法
  17. 数据库oracle--PL/SQL的使用-如何按f8只执行一行
  18. 【JMeter】Jmeter分布式压测教程
  19. coreldraw怎么画猴子_用CorelDraw制作一个可爱的调皮猴子
  20. 《出版专业基础》2015年版(初级)思考与练习 第八章

热门文章

  1. 【坑爹微信】总有一款接口能坑你到吐血 --- 微信开发经验录
  2. python标准模块--os
  3. 一场面试,用20秒介绍自己顺便教训了领导
  4. java基础(5)----面向对象
  5. 斯坦福机器学习视频笔记 Week6 关于机器学习的建议 Advice for Applying Machine Learning...
  6. eclipse下使用maven配置库托管jar包
  7. 深入理解Java:注解(Annotation)--注解处理器
  8. maven整合S2SH
  9. UVa 1025 A Spy in the Metro
  10. 构建之法第四章读后感