我们有一个Kafka集群,由3个节点组成,每个节点有32GB内存和6个内核2.5 CPU。
我们写了一个 kafka 制作人,它接收来自 Twitter 的推文,然后分批发送给 Kafka,每批 5000 条推文。
在生产者中,我们使用生产者.send(list
推特的平均大小为7KB。
打印send语句前后以毫秒为单位的时间来测量发送5000条消息所需的时间,我们发现大约需要3.5秒。
问题
我们测试 Kafka 性能的方式是否正确?
使用接受键控消息列表的send方法是向Kafka发送批量消息的正确方式吗?还有别的办法吗?
影响生产者绩效的重要配置有哪些?
您只测量生产者方面?该指标只告诉您在单位时间内可以存储多少数据。
也许这就是您想要衡量的,但由于您的问题的标题是“Kafka性能”,我认为您实际上想要衡量吞吐量,即消息通过Kafka需要多长时间(通常称为端到端延迟)。
您可以通过测量消费者发送消息和在另一端接收该消息之间的时间差异来实现这一点。
如果集群配置正确(默认配置即可),您应该会看到延迟范围从几毫秒(小于10毫秒)到50毫秒(几十毫秒)。
Kafka能够做到这一点,因为消费者读取的消息甚至不会接触磁盘,因为它们仍然在内存(页面缓存和套接字缓冲区缓存)中。请记住,这只有在您能够“赶上”消费者时才有效,即没有很大的消费者滞后。如果消费者落后于生产者,消息最终将从缓存中清除(取决于消息的速度——缓存填满新消息需要多长时间),因此必须从磁盘中读取。即使这样也不是世界末日(数量级较慢,在毫秒的低100s范围内),因为消息是连续写入的,一个接一个是一条直线,这是一个单一的磁盘查找。
顺便说一句,你只想给 Kafka 这 32GB 的一小部分,例如 5 到 8GB(即使是 G1 垃圾收集器也会因更大的尺寸而变慢),并将其他所有内容都未分配,以便操作系统可以将其用于页面和缓冲区缓存。
我目前正在开发Kafka模块,我正在使用Kafka通信的抽象。我能够集成生产者 Spring Boot测试类 监听器类 我的问题是:在测试类中,我断言分区、有效负载等是从BlockingQueue轮询的,然而,我的问题是如何验证用KafkaListener注释的类中的业务逻辑是否得到正确执行,并根据错误处理和其他业务场景将消息路由到不同的主题。在一些示例中,我看到了CountDownLatch的断
无论从什么角度来看,它都不是。 假设我有两个消费者,它们以每秒“10”条消息的速度从给定主题中消耗数据。现在,不管它们是从单个分区还是从两个不同的分区进行消耗;我的吞吐量将保持不变,每秒20条消息。 我觉得我一定漏了一些内部工作的细节,你能帮我解释一下kafka分区(多个)是如何帮助提高固定用户数量的吞吐量的,而不是单个kafka分区。
我编写了一个基本的Spring Boot服务,它通过rest API使用一些数据,并将其发布到rabbitmq和kafka。 为了测试处理kafka生成的服务类,我遵循以下指南:https://www.baeldung.com/spring-boot-kafka-testing 孤立地说,测试(KafkaMessagingServiceIMTest)在intellij想法和命令行上的mvn中都可以
来自Kafka文献 当制作人将ACK设置为“all”(或“-1”)时,此min.insync。副本配置指定必须确认写入才能被视为成功写入的最小副本数。 它表示当同步副本的最小数量确认时,写入成功,但当我使用为1和3(对于5个代理设置中的分区=1和R.F=5的主题),带有的kafka producer的性能是相同的。 所以,每主题配置会影响Kafka producer的吞吐量(独立运行)和?
一、生产者发送消息的过程 首先介绍一下 Kafka 生产者发送消息的过程: Kafka 会将发送消息包装为 ProducerRecord 对象, ProducerRecord 对象包含了目标主题和要发送的内容,同时还可以指定键和分区。在发送 ProducerRecord 对象前,生产者会先把键和值对象序列化成字节数组,这样它们才能够在网络上传输。 接下来,数据被传给分区器。如果之前已经在 Prod
Kafka文件说,幂等生产者是可能的,与相同的生产者会话,我无法理解这一点。 比方说,Kafka为每条消息添加序列号,最后一个序列号在Kafka中维护(不确定它维护在哪里)。 它是如何生成序列号的,它保存在哪里? 为什么当制作人崩溃并再次出现时,它不能保持序列? 我怎样才能使它在制作人会话之间真正幂等?