kafka优化

在生产环境中,有一个flink任务消费速度迟迟上不去,后面定位到是发送kafka的速度比较慢。这里是封装的代码:

java 复制代码
public void sendDelayMessage(String topic, String value, Time delayTime) {
        //boolean isFlush = false;
        boolean printLogs = false;
        try {
            ProducerRecord<String, String> producerRecord = new ProducerRecord(topic, value);
            producerRecord.headers().add("x-delay", String.valueOf(delayTime.toMilliseconds()).getBytes());
            producerRecord.headers().add("x-event", String.valueOf(System.currentTimeMillis()).getBytes());
            if (printLogs) {
                this.producer.send(producerRecord, (metadata, exception) -> {
                    log.info("kafkamessage: {}.", metadata.toString());
                });
            } else {
                this.producer.send(producerRecord);
            }

            if (isFlush) {
                this.producer.flush();
            }
        } catch (Exception var6) {
            var6.printStackTrace();
            log.error("producer exception,topic {},msg:{}, send kafka exception {}", new Object[]{topic, value, var6});
        }

    }

后面我把isFlush改成false,让它不走isflush,这样就不会被同步阻塞了,大大提升了发送效率。

flush() 方法的主要作用

强制将 KafkaProducer 缓冲区中的所有消息立即发送到 Kafka 集群,并且等待这些消息的确认。它用于确保消息被发送,并在需要时同步确认发送结果。具体来说,它有以下几个作用:

1. 刷新消息缓冲区

KafkaProducer 会把待发送的消息缓存在内存中,而不是每条消息都立即发送到 Kafka Broker。当你调用 flush() 时,它会强制将这些消息立即发送出去,并等待 Kafka Broker 的确认。

2. 同步等待消息确认

flush() 会使 send() 方法的异步操作变为同步操作。它会等待所有缓存的消息成功发送并确认,才能继续执行后续操作。如果发送过程中发生异常,flush() 会抛出错误。这个过程会使得应用程序阻塞,直到消息成功发送。

3. 确保消息发送完成

flush() 用来确保所有的消息已经发送到 Kafka 集群,并且所有的消息都已被 Kafka 确认。这对于确保消息在程序退出或关键操作前被可靠发送非常重要。

使用场景

  1. 程序结束时 :在应用程序退出之前调用 flush(),确保所有消息都已成功发送到 Kafka,防止消息丢失。

  2. 写入操作后 :如果你希望在发送特定消息后立即确保其成功发送并确认,可以在发送消息后调用 flush()

flush() 阻塞的原因

flush() 的作用是强制 KafkaProducer 将所有缓存在内部的消息立即发送到 Kafka 集群,并等待发送确认。如果你每次调用 flush() 都会等待消息被确认,这会导致以下影响:

  • 阻塞发送 :每次发送消息后,flush() 会阻塞直到所有的消息被成功发送并确认。这意味着发送消息的速度会受到网络延迟、Kafka Broker 负载以及消息确认的时间的影响。

  • 同步操作flush() 是一个同步操作,因此它会导致发送线程暂停,直到消息成功发送到 Kafka 服务器并得到确认。这可能会导致数据发送过程变慢,尤其是在发送大量消息时。

kafka发送过程

相关推荐
IpdataCloud20 小时前
跨境支付如何识别高风险IP?用IP风险画像服务选型与集成指南
服务器·网络·数据库·tcp/ip·安全
agilearchitect20 小时前
asyncpg:专为 asyncio 打造的 PostgreSQL 驱动
数据库·其他·postgresql
凡人叶枫20 小时前
Effective C++ 条款08:别让异常逃离析构函数
java·linux·数据库·c++·嵌入式开发
herinspace20 小时前
管家婆财工贸软件中关于价格常见问题小结
服务器·网络·数据库·电脑·管家婆软件
北风toto20 小时前
本体和智能体协同核心5步骤(生成sql语句)
数据库·sql
IvorySQL20 小时前
PostgreSQL 技术日报 (6月10日)|多工具版本更新,PG19 图语法落地
数据库·postgresql
lsyeei21 小时前
数据库分库分表
数据库
这个DBA有点耶21 小时前
Vibe Coding 是什么?当“感觉编程”遇上数据库
数据库·人工智能·架构·学习方法·ai编程·程序员创富·改行学it
数智化精益手记局21 小时前
拆解项目管理平台核心功能:看项目管理平台如何解决跨部门协作难题与多项目并行场景
大数据·运维·数据库·人工智能·产品运营
da-peng-song1 天前
ArcGIS Desktop使用入门(三)图层右键工具——定义查询
数据库·arcgis·拆分数据·定义查询