这是由两个输入主题(inputTopic1和inputTopic2)和一个输出主题(outputTopic)表示的整个拓扑。 首先,我们从第一个主题创建一个表-网络表及其Serdes。 其次,由于inputTopic2的键记录与inputTopic1的键不同,因此我们首先将流映射到新键值(companyId的长值),然后对所有值进行分组并汇总到整个公司的列表中,以便返回的表中,键是companyId,值是该公司所有卡的列表。
所有这些转换之后,我们将历史记录表与网络表连接起来,并将连接结果输出到新主题。
问题是,当我尝试将5万张历史数据卡放入inputTopic2中时,花费大量时间将它们汇总到列表中,并且生产者抛出以下错误:
org.apache.kafka.common.errors.TimeoutException:服务-KSTREAM-AGGREGATE-STATE-STORE-0000000005-changelog-1的1条记录已过期:自上一次尝试加上退避时间以来,已经过去了30043毫秒>
整个拓扑代码:
KTable<Long, DefaultDirectedGraph<Card, DefaultEdge>> networkTable = builder.table(inputTopic1,
Consumed.with(Serdes.Long(), new CompanyNetworkSeder()));
KTable<Long, List<Card>> historyListTable = builder
.stream(inputTopic2, Consumed.with(new HistoryDataKeySeder(), new HistoryDataValueSeder()))
.map(new KeyValueMapper<HistoryDataKey, Card, KeyValue<Long, Card>>() {
public KeyValue<Long, Card> apply(HistoryDataKey key, Card value) {
return new KeyValue<>(key.getCompanyId(), value);
}
}).groupByKey(Serialized.with(Serdes.Long(), new HistoryDataValueSeder())).aggregate(() -> {
return new ArrayList<Card>();
}, new Aggregator<Long, Card, List<Card>>() {
@Override
public List<Card> apply(Long key, Card newCard, List<Card> currentHistory) {
if (!historyUtils.checkForDuplicateHistoryCard(newCard, currentHistory)
&& !historyUtils.checkIfCardHasNoEndDate(newCard)) {
currentHistory.add(newCard);
}
return currentHistory;
}
}, Materialized.with(Serdes.Long(), new HistoryDataListValueSeder()));
KTable<Long, ForecastInput> joinedTable = historyListTable.leftJoin(networkTable, (history, network) -> {
if (network == null) {
return new ForecastInput();
} else if (history == null) {
return new ForecastInput(network, null);
} else {
return new ForecastInput(network, history);
}
});
KTable<Long, DefaultDirectedGraph<Card, DefaultEdge>> outputTable = joinedTable
.mapValues(new ValueMapperWithKey<Long, ForecastInput, DefaultDirectedGraph<Card, DefaultEdge>>() {
public DefaultDirectedGraph<Card, DefaultEdge> apply(Long companyId,
ForecastInput forecastInputData) {
DefaultDirectedGraph<Card, DefaultEdge> network = forecastInputData.getNetwork();
List<Card> history = forecastInputData.getHistory();
if (network == null) {
return new DefaultDirectedGraph<Card, DefaultEdge>(DefaultEdge.class);
} else if (history == null) {
return forecastInputData.getNetwork();
} else {
return (espService.updateForecastCalculationsForWholeCompany(forecastInputData.getNetwork(),
forecastInputData.getHistory()));
}
}
});
我认为问题在于聚合会减慢整个流的处理速度。我正在使用kafka 2.0.1版本。