当前位置: 首页 > 知识库问答 >
问题:

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

井学
2023-03-14

我正在使用Kafka制作器将价格发送到主题。当我发送第一条消息时,它会打印生产者配置,然后发送消息,因此发送第一条消息需要更多时间。

第一条消息后,发送消息几乎不需要 1/2 毫秒。

我的问题是我们可以做些什么,以便配置部分将跳过,或者我们可以在发送第一条消息之前开始?

我正在我的项目中使用SpringKafka。我也读了其他问题,但不是很有帮助。

应用程序.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
      

生产者价值:

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

我提到了以下问题,但没有帮助。

  1. 为什么骆驼Kafka的制作速度很慢
  2. Kafka制作人在第一条消息上反应迟钝

共有2个答案

易琨
2023-03-14

第一条消息很慢是什么意思?kafka send是异步的,不应该妨碍你自己的性能。它使用一个缓冲区来批量发送记录。

阅读下面的java文档了解更多信息,

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

石正信
2023-03-14

在第一次调用 KafkaProducer.send 方法期间,Kafka 生产者获取主题的分区元数据。提取元数据会阻止 send 方法立即返回。Kafka 生产者缓存元数据,因此后续发送速度要快得多。Kafka 创建者将元数据缓存 metadata.max.age.ms(默认为 5 分钟),之后它再次获取元数据以主动发现任何新的代理或分区。

当您的应用程序启动时,您可以调用KafkaProducer.partitionsFor方法来获取和缓存元数据,但是当缓存在5分钟后过期时,下一次发送将会很慢,因为它会再次获取元数据。如果您的Kafka环境是静态的,即在您的应用程序运行时没有创建新的代理和分区,那么请考虑将metadata.max.age.ms配置为很长的持续时间,这样元数据在缓存中保存的时间就会更长。

 类似资料:
  • 我对Kafka很陌生。我使用的是Kafka0.9.0.0客户端for Java。在使用特定主题的数据时,当我启动生产者-消费者java项目时,我每次都得到相同的消息(这是第一次发布的消息)。 我的要求是生成一些消息并使用它,检查两个消息是否相同。 有谁能给我指点一下吗?

  • 我正在使用Spring Boot中的。Java 8 我的主要目的是,消费者不应重复使用信息。 1)调用表获取100行并将其发送到kafka 2) 假设我处理了70行(我得到了成功确认),然后Kafka宕机了(Kafka在RETRY机制计时内无法恢复) 因此,当我重新启动Spring启动应用程序时,我如何确保不再发送这70条消息。 一种选择是我可以在数据库表消息 中使用标志。 还有其他有效的方法吗?

  • 我正在尝试从 kafka 主题中获取消息,并看到如果我将 auto.commit.reset 策略设置为“最早”,则所有消息都会得到正确处理。但是,如果设置为“最新”,则第一条消息将丢失,其余消息将得到正确处理。如果我在这里错过了什么,任何人都可以帮忙吗?

  • 我很感激你在这方面的帮助。 我正在构建一个ApacheKafka消费者,以订阅另一个已经运行的Kafka。现在,我的问题是,当我的制作人将消息推送到服务器时。。。我的消费者没有收到。。我在打印的日志中得到以下信息: 我不确定我是否遗漏了任何重要的配置。。。但是,我可以使用WireShark看到一些来自我的服务器的消息,但是我的消费者没有消费这些消息。。。。 我的代码是示例消费者示例的精确副本:ht

  • 我们有一个制作人 在开发过程中,我重新部署了producer应用程序,并做了一些更改。但在此之后,我的消费者没有收到任何消息。我尝试重新启动消费者,但没有成功。问题可能是什么和/或如何解决? 消费者配置: 生产者配置: 编辑2: 5分钟后,消费者应用程序死亡,但以下情况除外: