如何解析卡夫卡性能优化

介绍

这期内容当中小编将会给大家带来有关如何解析卡夫卡性能优化,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

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

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

<李>

,操作系统把数据从文件拷贝内核中的页缓存中

<李>

应用程序从页缓存从把数据拷贝自己的内存缓存中

<李>

应用程序将数据写入到内核中插座缓存中

<李>

,操作系统把数据从套接字缓存中拷贝到网卡接口缓存,从这里发送到网络上。


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

上述就是小编为大家分享的如何解析卡夫卡性能优化了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

如何解析卡夫卡性能优化