gpt4 book ai didi

java - 如何一起对 Kafka Streams 和 Producer API 进行单元测试

转载 作者:行者123 更新时间:2023-12-02 09:02:43 27 4
gpt4 key购买 nike

目前,我有一个基本的 Kafka 流应用程序,其中涉及仅具有源和处理器但没有接收器的拓扑。本质上,拓扑仅处理消息的消费。至于生成消息,我们在传递给拓扑的 ProcessorSupplier 实例中调用 Producer API,特别是在重写的 process 方法中。虽然我知道 Producer API 在这里是多余的,因为我可以简单地向拓扑添加一个接收器,但我必须以这种方式设置我的流应用程序。至于测试,我尝试了 kafka-streams-test-utils 中提供的 TopologyTestDriver 类。包裹。但是,我不仅想测试拓扑,还想测试对 Producer API 的调用。使用 TopologyTestDriver 需要我模拟我的 Producer 实例,因为它与 Streams API 是分开的。因此,由于消息未“转发”,我无法从 TopologyTestDriver 读取消息以进行单元测试。

这是我的process方法的简化版本:

@Override
public void process(String key, String value) {
// some data processing stuff that I leave out for simplicity sake
String topic = "...";
Properties props = ...;
//Producer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = new ProducerRecord(topic, key, value);
producer.send(record);
}

这是我的示例单元测试的简化:

@Test
public void process() {
Topology topology = new Topology();
topology.addSource("source", "input-topic");
topology.addProcessor("processor", ..., "source");
Properties props = ...;

TopologyTestDriver testDriver = new TopologyTestDriver(topology, props);

ConsumerRecordFactory<String, String> factory = new ConsumerRecordFactory<>(new StringSerializer(), new StringSerializer());
// the following line will work fine as long as the producer is mocked
testDriver.pipeInput(factory.create("input-topic", "key", "value"));

// since the producer is mocked, no message can be read from the output topic
ProducerRecord<String, String> outputRecord = testDriver.readOutput("output-topic", new StringDeserializer(), new StringDeserializer());

assertNull(outputRecord); // returns true
}

总结一下我的问题,有没有一种方法可以编写一个单元测试来测试拓扑中消息的消耗和生成,该拓扑使用 Producer API 将消息写入传出主题?

最佳答案

您不应使用自定义Producer,而应向您的Topology 添加接收器。对 Producer.send() 的调用是异步的,因此您可能会丢失数据。为了避免数据丢失,您需要使调用同步,即获取由 send() 返回的 Future 并在 process 之前等待其完成() 返回。但是,这会对您的吞吐量产生很大影响,因此不建议这样做。

如果您添加接收器,则可以避免这些问题,因为 Kafka Streams 现在将了解哪些数据发送到输出主题,因此不会发生数据丢失,而 Kafka Streams 可以使用性能更高的异步调用。

除了正确性问题之外,您似乎还为当前代码中处理的每条消息创建了一个新的 KafkaProducer ,这是相当低效的。此外,使用接收器将简化您的代码。当然,您可以使用 TopologyTestDriver 获得适当的测试功能。

关于java - 如何一起对 Kafka Streams 和 Producer API 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60045851/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com