我已经设置了一个简单的聚合平均来自多个流的值,我正在尝试测试它。我已经烧了很多时间,我似乎无法直接理解这些概念。我的信息流如下:
// Combine multiple streams together.
KStream<String, IndividualTick> tickerStream =
priceIndexStreamBuilder.stream(exchangeTopics, Consumed.with(...));
// Group by a key & compute average per key
KStream<K, AveragedTick> avgTickerStream = tickStream.selectKey((key,
value) -> value.getK())
.groupByKey(...)
.aggregate(AvgTick::new,
(key, value, aggregate) -> {
aggregate.addTick(value);
return aggregate;
},
Materialized.with(...))
.toStream();
indexTickerStream.to(sinkTopic, Produced.with(...));
我的测试使用EmbeddedKafka,将一堆记录发布到主题,并且位于阻塞的队列中,等待记录到达sinkTopic
。
我对这种聚合如何随时间变化感兴趣,所以我想在每个输出代码上断言平均值。我可以添加一定程度的窗口,但我现在试图保持简单。
当我进行测试时,我会得到不同的结果。假设我的拓扑中有10条输入记录:
AverageTick
序列化程序中的断点被调用了不同的次数。我认为这是因为KIP-63中定义的缓存功能 - 记录很快出现在处理节点上,并被最新记录合并/覆盖。 (虽然我不完全确定。)
我使用ProcessorTopologyTestDriver
传递单元测试,但我正在尝试为保持此逻辑的服务编写一些验收测试。
我也尝试过使用我的commit.interval.ms
配置,以及在发布我的输入记录之间进行睡眠,以及不同程度的(片状)成功。
我觉得我在这里做了一些概念错误的事情 - 我只是不知道还有什么方法可以采取。
答案 0 :(得分:3)
你的观察是正确的。缓存使测试变得困难,因为它引入了非确定性。
要编写有用的测试,您有两种选择:
顺便说一句:在即将到来的1.1中,Kafka添加了一个公共测试包,我们计划添加更多:https://cwiki.apache.org/confluence/display/KAFKA/KIP-247%3A+Add+public+test+utils+for+Kafka+Streams