简体   繁体   English

为什么 kafka 生产者在第一条消息上很慢?

[英]Why kafka producer is very slow on first message?

I am using kafka producer to send prices to topic.我正在使用 kafka 生产者将价格发送到主题。 When I send first message it prints producer config and then send message due to this it takes more time to send first message .当我发送第一条消息时,它会打印生产者配置,然后发送消息,因此发送第一条消息需要更多时间。

After first message it tooks hardly 1/2 milliseconds to send a message .在第一条消息之后,发送一条消息几乎需要 1/2 毫秒。

My question is can we do something so that configuration part will skip or we can start before to send first message ?我的问题是我们可以做些什么来跳过配置部分还是我们可以在发送第一条消息之前开始?

I am using spring kafka into my project.我在我的项目中使用 spring kafka。 I read other question also but not really helpful .我也阅读了其他问题,但并不是很有帮助。

Application.yml应用程序.yml

server:
  port: 8081
spring:
    kafka:
      bootstrap-servers:   ***.***.*.***:9092
      producer:
          key-serializer: org.apache.kafka.common.serialization.StringSerializer
          value-serializer: org.apache.kafka.common.serialization.StringSerializer
      

Producer Values :生产者价值观:

acks = 1
batch.size = 16384
bootstrap.servers = [192.168.1.190:9092]
buffer.memory = 33554432
client.dns.lookup = default
client.id = 
compression.type = none
connections.max.idle.ms = 540000
delivery.timeout.ms = 120000
enable.idempotence = false
interceptor.classes = []
key.serializer = class org.apache.kafka.common.serialization.StringSerializer
linger.ms = 0
max.block.ms = 60000
max.in.flight.requests.per.connection = 5
max.request.size = 1048576
metadata.max.age.ms = 300000
metric.reporters = []
metrics.num.samples = 2
metrics.recording.level = INFO
metrics.sample.window.ms = 30000
partitioner.class = class org.apache.kafka.clients.producer.internals.DefaultPartitioner
receive.buffer.bytes = 32768
reconnect.backoff.max.ms = 1000
reconnect.backoff.ms = 50
request.timeout.ms = 30000
retries = 2147483647
retry.backoff.ms = 100
sasl.client.callback.handler.class = null
sasl.jaas.config = null
sasl.kerberos.kinit.cmd = /usr/bin/kinit
sasl.kerberos.min.time.before.relogin = 60000
sasl.kerberos.service.name = null
sasl.kerberos.ticket.renew.jitter = 0.05
sasl.kerberos.ticket.renew.window.factor = 0.8
sasl.login.callback.handler.class = null
sasl.login.class = null
sasl.login.refresh.buffer.seconds = 300
sasl.login.refresh.min.period.seconds = 60
sasl.login.refresh.window.factor = 0.8
sasl.login.refresh.window.jitter = 0.05
sasl.mechanism = GSSAPI
security.protocol = PLAINTEXT
send.buffer.bytes = 131072
ssl.cipher.suites = null
ssl.enabled.protocols = [TLSv1.2, TLSv1.1, TLSv1]
ssl.endpoint.identification.algorithm = https
ssl.key.password = null
ssl.keymanager.algorithm = SunX509
ssl.keystore.location = null
ssl.keystore.password = null
ssl.keystore.type = JKS
ssl.protocol = TLS
ssl.provider = null
ssl.secure.random.implementation = null
ssl.trustmanager.algorithm = PKIX
ssl.truststore.location = null
ssl.truststore.password = null
ssl.truststore.type = JKS
transaction.timeout.ms = 60000
transactional.id = null
value.serializer = class org.apache.kafka.common.serialization.StringSerializer

I refer following questions but not helped.我参考了以下问题,但没有帮助。

  1. Why is camel kafka producer very slow? 为什么骆驼 kafka 生产者很慢?
  2. Kafka producer is slow on first message Kafka 生产者在第一条消息上很慢

During the first invocation of the KafkaProducer.send method, the Kafka producer fetches the partition metadata for the topic.在第一次调用KafkaProducer.send方法期间,Kafka 生产者获取主题的分区元数据。 Fetching the metadata blocks the send method from returning immediately.获取元数据会阻止 send 方法立即返回。 The Kafka producer caches the metadata, so subsequent sends are much faster. Kafka 生产者缓存元数据,因此后续发送要快得多。 The Kafka producer caches the metadata for metadata.max.age.ms (default 5 minutes), after which it again fetches the metadata to proactively discover any new brokers or partitions. Kafka 生产者缓存 metadata.max.age.ms 的元数据(默认 5 分钟),之后它再次获取元数据以主动发现任何新的代理或分区。

When your application starts, you could invoke the KafkaProducer.partitionsFor method to fetch and cache the metadata, but when the cache expires after 5 minutes, the next send will be slow because it fetches the metadata again.当您的应用程序启动时,您可以调用KafkaProducer.partitionsFor方法来获取和缓存元数据,但是当缓存在 5 分钟后过期时,下一次发送会很慢,因为它会再次获取元数据。 If your Kafka environment is static, that is, new brokers and partitions are not created while your application is running, then consider configuring metadata.max.age.ms to a very long time duration, so the metadata is kept in the cache longer.如果您的 Kafka 环境是静态的,即在您的应用程序运行时没有创建新的代理和分区,那么请考虑将metadata.max.age.ms配置为很长的持续时间,以便元数据在缓存中保留的时间更长。

what do mean by first message is slow?第一条消息很慢是什么意思? kafka send is asynchronous and should not hinder your own performance. kafka 发送是异步的,不应妨碍您自己的性能。 it uses a buffer that it uses to send records in batches.它使用一个缓冲区,用于批量发送记录。

read below java docs for more info,阅读下面的java文档以获取更多信息,

https://kafka.apache.org/10/javadoc/org/apache/kafka/clients/producer/KafkaProducer.html https://kafka.apache.org/10/javadoc/org/apache/kafka/clients/producer/KafkaProducer.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM