Apache kafka 保证在水平kafka上扩展节点时快速处理数据

Apache kafka 保证在水平kafka上扩展节点时快速处理数据,apache-kafka,kafka-consumer-api,apache-kafka-streams,Apache Kafka,Kafka Consumer Api,Apache Kafka Streams,我用java构建了一个kafka应用程序,它具有: 为卡夫卡制作唱片的制作人 使用这些记录的卡夫卡流,对其值应用一些(时间窗口和状态存储)操作并将其发送回卡夫卡 消费者消费这些转换后的值并将其写入数据库 我正在测量生产者记录(被卡夫卡流消费)和消费者记录(被消费者消费)的卡夫卡时间戳之间的时间差。基本上,当生产者记录被创建时,当这个记录被流转换并发送回卡夫卡时。最后,我计算数据库中每个时差的平均值 无论出于何种原因,当我在主题中添加更多的流节点和分区时,时间差都会增加。事实上,我预计时差会减

我用java构建了一个kafka应用程序,它具有:

  • 为卡夫卡制作唱片的制作人
  • 使用这些记录的卡夫卡流,对其值应用一些(时间窗口和状态存储)操作并将其发送回卡夫卡
  • 消费者消费这些转换后的值并将其写入数据库
我正在测量生产者记录(被卡夫卡流消费)和消费者记录(被消费者消费)的卡夫卡时间戳之间的时间差。基本上,当生产者记录被创建时,当这个记录被流转换并发送回卡夫卡时。最后,我计算数据库中每个时差的平均值

无论出于何种原因,当我在主题中添加更多的流节点和分区时,时间差都会增加。事实上,我预计时差会减小。现在我想知道我是否做错了什么,或者通过增加节点数量,数据处理会花费更长的时间

最后,我的问题是:是否可以通过向卡夫卡添加更多节点来延长数据处理时间?如果是,原因可能是什么

“是否可能通过向卡夫卡添加更多节点来延长数据处理时间?如果是,原因可能是什么?”

是的,这可能发生,并且高度依赖于实际生成的数据量。需要通过使用更多的分区/流节点来平衡数据量和并行性,以避免不必要的开销

在您的特定案例中,我能想到的主要原因是KafkaProducer端的批处理更高效,分区数量更少

假设您有10条消息和一个分区。KafkaProducer可能会将这10条消息组合成一个批,并对其应用压缩,这似乎相当有效

现在,如果您有10条消息和10个分区,使得每条消息都进入自己的分区,那么KafkaProducer必须向代理发送10个单独的发送请求(每个分区一个),而且您的压缩率也较低,因为您总是只压缩一条消息


此外,如果您的KafkaProducer在同步模式下工作,它必须更频繁地等待代理的回复(这可能会根据生产商配置
acks
max.request.In.flight
而有所不同)。

谢谢您的回复。在消息和分区之间找到一个良好平衡的唯一方法是试错吗?或者你能从多个分区和节点的消息数(每秒)判断它是否值得使用吗?我认为这主要是反复试验。至少我不知道有任何一刀切的解决方案,因为每个集群的行为完全不同(网络速度、代理数量、其他硬件…),您确定您正在测量您想要测量的内容吗。我不知道你在卡夫卡流部分做了什么,但记录时间戳一般不是挂钟时间。特别是,流发送到输出主题的记录的时间戳是由记录上的操作定义的,而不是由挂钟时间定义的。据我所知,卡夫卡时间戳是在记录到达卡夫卡时分配的,不幸的是,卡夫卡时间戳没有得到很好的记录-可能是我误解了这一点。最后,我只想知道记录从制作人发送到卡夫卡和从流发送回卡夫卡需要多长时间。我可以推荐这两次谈话,以便更好地理解卡夫卡和卡夫卡流中的时间语义:这个为卡夫卡流引入端到端延迟度量的KIP也可能是对你来说很有趣:谢谢布鲁诺,这对我来说确实很有趣,我会看看的