前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >消息队列(3)--Kafka高性能是怎么做到的

消息队列(3)--Kafka高性能是怎么做到的

原创
作者头像
小时的棒棒糖
发布2023-10-05 19:50:11
3051
发布2023-10-05 19:50:11
举报

Kafka是高性能的消息队列,在消息中间件中,它的性能绝对是第一梯队

究其原因,除了通用的性能优化手段,

  1. 全异步化的线程模型 只用少量的线程,就能达到超高的吞吐能力,缺点是代码复杂度要大很多
  2. 高性能的异步网络传输 使用基于NIO的多路复用技术的Netty通信框架进行网络通信,NIO提供了 Selector 机制,用单个线程同时管理多个连接
  3. 自定义的私有传输协议 双方应用程序的交流规范就是传输协议,二进制流可以使用“分隔符”和“前置长度”两种断句方法,使用 ID 来标识请求与响应对应关系”的方法,是一种比较通用的实现双工通信的方法,可以有效提升数据传输的吞吐量。
  4. 自定义的私有的序列化和反序列化 将结构化数据和二进制流双向转换,高性能的进程之间传输数据,在选择序列化实现的时候,需要综合考虑数据可读性,实现复杂度,性能和信息密度这四个因素。

还有如下方法和优化技巧?

1.批量处理消息,提高系统吞吐量

发送拉取消息和Broker服务端存储消息,都是以批为单元进行的,消费者在拉取消息后,在客户端把批消息解开,再一条一条交给用户代码处理。

构建批消息和解开批消息分别在发送端和消费端的客户端完成,不仅减轻了 Broker 的压力,最重要的是减少了 Broker 处理请求的次数,提升了总体的处理能力。

2.使用操作系统的PageCach缓存消息,减少磁盘IO

在 Kafka 中,它会利用 PageCache 加速消息读写。PageCache 是现代操作系统都具有的一项基本特性。通俗地说,PageCache 就是操作系统在内存中给磁盘上的文件建立的缓存。

应用程序在写入文件的时候,操作系统会先把数据写入到内存中的 PageCache,然后再一批一批地写到磁盘上。读取文件的时候,也是从 PageCache 中来读取数据。

Kafka 在读写消息文件的时候,充分利用了 PageCache 的特性。一般来说,消息刚刚写入到服务端就会被消费,按照 LRU 的“优先清除最近最少使用的页”这种策略,读取的时候,对于这种刚刚写入的 PageCache,命中的几率会非常高。

也就是说,大部分情况下,消费读消息都会命中 PageCache,带来的好处有两个:一个是读取的速度会非常快,另外一个是,给写入消息让出磁盘的 IO 资源,间接也提升了写入的性能。

3.使用顺序读写磁盘,提升磁盘读写性能

顺序读写相比随机读写省去了大部分的寻址时间,它只要寻址一次,就可以连续地读写下去,所以说,性能要比随机读写要好很多。

Kafka 就是充分利用了磁盘的这个特性。它的存储设计非常简单,对于每个分区,它把从 Producer 收到的消息,顺序地写入对应的 log 文件中,一个文件写满了,就开启一个新的文件这样顺序写下去。消费的时候,也是从某个全局的位置开始,也就是某一个 log 文件中的某个位置开始,顺序地把消息读出来。

4.零拷贝技术

首先,从文件中找到消息数据,读到内存中;

然后,把消息通过网络发给客户端。

这个过程中,数据实际上做了 2 次或者 3 次复制:

从文件复制数据到 PageCache 中,如果命中 PageCache,这一步可以省掉;

从 PageCache 复制到应用程序的内存空间中,也就是我们可以操作的对象所在的内存;

从应用程序的内存空间复制到 Socket 的缓冲区,这个过程就是我们调用网络应用框架的 API 发送数据的过程。

Kafka 使用零拷贝技术可以把这个复制次数减少一次,上面的 2、3 步骤两次复制合并成一次复制。直接从 PageCache 中把数据复制到 Socket 缓冲区中,这样不仅减少一次数据复制,更重要的是,由于不用把数据复制到用户内存空间,DMA 控制器可以直接完成数据复制,不需要 CPU 参与,速度更快。

5.Kafka 是否开启压缩,这是可以配置

在开启压缩时,Kafka 选择一批消息一起压缩,每一个批消息就是一个压缩分段。使用者也可以通过参数来控制每批消息的大小。

Kafka 在生产者上,对每批消息进行压缩,批消息在服务端不解压,消费者在收到消息之后再进行解压。简单地说,Kafka 的压缩和解压都是在客户端完成的,在服务端不用解压,就不会耗费服务端宝贵的 CPU 资源,同时还能获得压缩后,占用传输带宽小,占用存储空间小的这些好处

总结:

Kafka 的高性能设计中的几个关键的技术点:

代码语言:txt
复制
* 使用批量处理的方式来提升系统吞吐能力。
* 基于磁盘文件高性能顺序读写的特性来设计的存储结构。
* 利用操作系统的 PageCache 来缓存数据,减少 IO 并提升读性能。
* 使用零拷贝技术加速消费流程。以上这些,就是 Kafka 之所以能做到如此高性能的关键技术点。你可以看到,要真正实现一个高性能的消息队列,是非常不容易的,你需要熟练掌握非常多的编程语言和操作系统的底层技术。扩展:下篇文章分享Kafka拉取消息过程,附Kafka拉取消息的时序图

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Kafka是高性能的消息队列,在消息中间件中,它的性能绝对是第一梯队
  • 还有如下方法和优化技巧?
    • 1.批量处理消息,提高系统吞吐量
      • 2.使用操作系统的PageCach缓存消息,减少磁盘IO
        • 3.使用顺序读写磁盘,提升磁盘读写性能
          • 4.零拷贝技术
            • 5.Kafka 是否开启压缩,这是可以配置
              • 总结:
              相关产品与服务
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档