首页 > 其他分享 >场景题:如何提升Kafka效率?

场景题:如何提升Kafka效率?

时间:2024-08-30 17:30:08浏览次数:8  
标签:场景 批量 Kafka 发送 消息 拉取 效率 客户端

Kafka 以其高吞吐量、低延迟和可扩展性而备受青睐。无论是在实时数据分析、日志收集还是事件驱动架构中,Kafka 都扮演着关键角色。

但是,如果 Kafka 使用不当,也可能会面临性能瓶颈,影响系统的整体效率。所以,了解如何提升 Kafka 的运行效率?对于生产环境的使用和面试都是至关重要的。

那么,提升 Kafka 性能的有效手段都有哪些呢?接下来,我们一起来看。

性能调优主要手段

Kafka 性能调优的主要手段有以下几个:

  1. 分区扩展
  2. 消息批发送(重要)
  3. 消息批获取(重要)
  4. 配置调优
  5. JVM 调优

image.png

1.分区扩展

在 Kafka 架构中,使用多分区(Partition)来实现数据分片功能。也就是 Kafka 会将多条消息并发存储到一个主题(Topic)的多个 Broker(Kafka 服务)中的多个 Partition 中,以实现并行操作的功能,极大地提高了整体系统的读写能力,如下图所示:

数据分片是一种技术将大数据分割成更小、更易于管理的片段(称为“分片”),并将分片都存储在不同的服务器上,从而实现了数据的水平拆分。通过数据分片,可以有效地解决单一数据库的性能瓶颈、存储限制以及高可用性等问题。

因此,增加更多的 Broker,扩展更多的分区 Partition 是提升 Kafka 性能的关键,如下图所示:
image.png

2.消息批发送(重要)

Kafka 默认是不支持批量发送消息的,然而开启批量发送消息可以提升 Kafka 整体运行效率。

为什么要批量发送消息?

批量发送消息有以下优点:

  1. 减少网络开销:当生产者发送消息给 Kafka 时,如果每次只发送一条消息,那么就需要建立一次 TCP 连接,这涉及到三次握手的过程。而如果采用批量发送的方式,则可以在一次 TCP 连接中发送多条消息,减少了网络连接建立和断开的次数,从而降低了网络开销。
  2. 减少 I/O 操作:批量发送意味着一次写入操作可以处理更多的数据。这对于磁盘 I/O 来说是一个优势,因为一次大的写操作比多次小的写操作更高效。
  3. 提高吞吐量:由于减少了通信次数,批量发送可以提高单位时间内发送的消息数量,即提高了吞吐量。

那么,想要实现 Kafka 批量消息发送只需要正确配置以下 3 个参数即可:

  1. batch-size:定义了 Kafka 生产者尝试批量发送的消息的最大大小(以字节为单位),生产者收集到足够多的消息达到这个大小时,它会尝试发送这些消息给 Kafka Broker,默认值为 16KB。
  2. buffer-memory:指定了 Kafka 生产者可以用来缓冲待发送消息的总内存空间,如果生产者试图发送的消息超过了这个限制,生产者将会阻塞,直到有足够空间可用或者消息被发送出去,默认值为 32MB。
  3. linger.ms:生产者在尝试发送消息前等待的最长时间(以毫秒为单位)。默认情况下,linger.ms 的值为 0,这意味着立即发送。

以上 3 个参数满足任一个都会立即(批量)发送。

因此我们如果需要匹配发送,主要需要调整的参数是 linger.ms,如下配置所示:

spring:
  kafka:
    bootstrap-servers: localhost:9092 # Kafka服务器地址
    consumer:
      group-id: my-group # 消费者组ID
      auto-offset-reset: earliest # 自动重置偏移量到最早的可用消息
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer # 键的反序列化器
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer # 值的反序列化器
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer # 键的序列化器
      value-serializer: org.apache.kafka.common.serialization.StringSerializer # 值的序列化器
      batch-size: 16384
      buffer-memory: 33554432
      properties:
        linger:
          ms: 2000

3.消息批获取(重要)

Kafka 默认每次拉取一条消息,而使用批量获取消息可以有效提升 Kafka 运行效率。

为什么要批量获取消息?

批量获取消息有以下优点:

  1. 降低客户端处理开销:对于客户端来说,每次处理一个消息需要进行一系列的操作,如解包、解析、处理逻辑等。如果每次只拉取一个消息,客户端会频繁地进行这些操作,带来较大的处理开销。而批量拉取消息时,客户端可以一次性处理多个消息,减少了处理单个消息的频率,从而降低了客户端的处理开销。
  2. 减少网络往返次数:每次拉取一个消息时,客户端需要与 Kafka 服务器进行多次网络往返,包括发送请求、接收响应等。这些网络往返会带来一定的延迟。而批量拉取消息时,客户端可以一次性拉取多个消息,减少了网络往返的次数,从而降低了网络延迟。
  3. 优化内存使用:批量拉取消息可以更好地规划和利用内存。客户端可以一次性分配足够的内存来存储批量拉取的消息,避免了频繁地分配和释放小内存块的操作。这样可以提高内存的使用效率,减少内存碎片的产生,进而提升系统的运行效率。
  4. 提高吞吐量:批量拉取消息可以提高单位时间内处理的消息数量,从而提升了 Kafka 的吞吐量。

想要实现批量读取数据需要做以下两步调整:

  1. 在配置文件中设置批读取:
spring.kafka.listener.type=batch
  1. 消费者使用 List<ConsumerRecord> 接收消息,具体实现代码如下:
@KafkaListener(topics = TOPIC)
public void listen(List<ConsumerRecord<?, ?>> consumerRecords) {
    for (int i = 0; i < consumerRecords.size(); i++) {
        System.out.println("监听到消息:" + consumerRecords.get(i).value());
    }
    System.out.println("------------end------------");
}

以上程序的执行结果如下:
image.png
从执行结果可以看出:只有一个“end”打印,这说明 Kafka 一次拉取了一批数据,而不是一个数据,否则就会有多个“end”。

4.配置调优

合理设置 Kafka 的配置也可以一定程度的提升 Kafka 的效率,例如以下这些配置:

  1. 配置文件刷盘策略:调整 flush.ms 和 flush.messages 参数,控制数据何时写入磁盘。较小的值可以降低延迟,而较大的值可以提高吞吐量
  2. 网络和 IO 操作线程配置优化:num.network.threads 应该设置为 CPU 核心数加 1,以充分利用硬件资源。调整 socket.send.buffer.bytes 和 socket.receive.buffer.bytes 以优化网络缓冲区大小,缓冲区越大,吞吐量也越高。

5.JVM 调优

因为 Kafka 是用 Java 和 Scala 两种语言编写的,而 Java 和 Scala 都是运行在 JVM 上的,因此保证 JVM 的高效运行,设置合理的垃圾回收器,也能间接的保证 Kafka 的运行效率。例如,对于大内存机器,可以使用 G1 垃圾收集器来减少 GC 暂停时间,并为操作系统留出足够的内存用于页面缓存。

课后思考

除了以上手段之后,我们还可以使用消息压缩等手段提升 Kafka 的运行效率。那么问题来了,如何开启 Kafka 的消息压缩?如何设置消息的压缩级别?

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

标签:场景,批量,Kafka,发送,消息,拉取,效率,客户端
From: https://www.cnblogs.com/vipstone/p/18389137

相关文章

  • Clobotics 计算机视觉场景存储实践:多云架构、 POSIX 全兼容、低运维的统一存储HB
    Clobotics是一家将计算机视觉和机器学习技术应用于风电以及零售行业的企业。在风电行业,Clobotics利用无人机对风力发电机叶片进行检查,显著降低了对人工作业的依赖。在零售领域,公司通过分析捕获的包装商品图像来提供基于实时数据的洞察,以增加销售额并减少运营成本。存储方面,Clob......
  • auto的使用场景
    auto的两面性合理使用auto不仅可以减少代码量,也会大大提高代码的可读性.但是事情总有它的两面性如果滥用auto,则会让代码失去可读性推荐写法这里推荐两种情况下使用auto一眼就能看出声明变量的初始化类型的时候比如迭代器的循环,用例如下#include<iostream>......
  • Clobotics 计算机视觉场景存储实践:多云架构、 POSIX 全兼容、低运维的统一存储
    Clobotics是一家将计算机视觉和机器学习技术应用于风电以及零售行业的企业。在风电行业,Clobotics利用无人机对风力发电机叶片进行检查,显著降低了对人工作业的依赖。在零售领域,公司通过分析捕获的包装商品图像来提供基于实时数据的洞察,以增加销售额并减少运营成本。存储方面,Clob......
  • 5G RedCap工业网关的应用场景与优势
    在工业物联网领域,5GRedCap工业网关凭借其低功耗、低成本和高性能的特点,广泛应用于各种工业设备、传感器和控制系统之间的高效连接。不仅支持实时数据采集传输,还能大幅降低部署成本,提升数据传输的可靠性和效率,从而提高生产效率和产品质量。 物通博联推出的5GRedCap工业网关是一款......
  • 【效率工具】推荐几款好用的idea中的AI助手插件
    1.Tabnine特点:Tabnine提供智能代码补全功能,基于深度学习的模型来预测和补全代码块。它可以根据你当前代码的上下文,智能推荐代码、函数、类、变量名等。支持多种语言,包括Java、Python、JavaScript等,特别适合Java开发者。Tabnine可以在本地运行,保护代码隐私。优势:提高......
  • kafka指定key进行分区遇到的问题
    问题描述:kafka在指定key进行分区的时候,若某一个分区异常,则发往这个分区的数据均会失败;没有指定key进行分区的便不会出现改问题。看一下producer的源码:publicintpartition(Stringtopic,Objectkey,byte[]keyBytes,Objectvalue,byte[]valueBytes,Clustercluster){......
  • 好多kafka难题啊,看看其中的化解之道
    文末有面经共享群前面已经分享过几篇面试了,这是一篇关于更加面向项目和技术的面经详解,第一次遇见问那么多kafka的问题,看看这个粉丝是怎么回答的。先来看看职位描述:岗位职责:负责基于Go的后端服务的设计、开发和维护;参与系统架构设计,确保系统的高可用性、高性能和可扩展性;......
  • Kafka分布式集群部署实战:跨越理论,直击生产环境部署难题与解决方案,性能调优、监控与管
    本文介绍kafka的集群如何部署和安装,1-4章理论知识,第5章详解集群的部署,部署Kafka之前需要先部署好分布式的Zookeeper,不喜欢理论的可以直接看第5章,欢迎大家一起探讨技术!Zookeeper集群部署参考文章:精通Zookeeper:详解分布式集群部署全程,掌握数据一致性、选举机制与集群容错能力-......
  • openGauss-应用场景
    openGauss-应用场景交易型应用大并发、大数据量、以联机事务处理为主的交易型应用,如电商、金融、O2O、电信CRM/计费等,应用可按需选择不同的主备部署模式。物联网数据在工业监控和远程控制、智慧城市的延展、智能家居、车联网等物联网场景下,传感监控设备多,采样率高,数据存......
  • MySQL 支持两种主要类型的备份方法:物理备份和逻辑备份。这两种备份方法各有优缺点,适用
    物理备份物理备份是指直接备份MySQL数据库的物理文件,包括数据文件、日志文件、配置文件等。物理备份通常分为冷备份(脱机备份)和热备份(联机备份)。冷备份(ColdBackup)定义: 在数据库完全停止的情况下进行的备份。特点:  简单快速,因为只需复制文件。可以在任何时间点进行。不需要锁......