同样但问题略有不同:KStream batch process windows,我想在将消息推送到消费者之前批量处理来自KStream
的消息。
但是,不应在固定的时间窗口上安排此下推,而是在每个密钥的固定消息计数阈值上安排。
对于初学者来说,我会想到两个问题:
1)自定义AbstractProcessor
应该如何处理?有点像:
@Override
public void punctuate(long streamTime) {
KeyValueIterator<String, Message[]> it = messageStore.all();
while (it.hasNext())
KeyValue<String, Message[]> entry = it.next();
if (entry.value.length > 10) {
this.context.forward(entry.key, entry.value);
entry.value = new Message[10]();
}
}
}
2)由于StateStore
可能会爆炸(如果条目值永远不会达到阈值以便转发),那么“垃圾收集”的最佳方法是什么?这个?我可以做一个基于时间的计划并删除太旧的键......但这看起来很DIY并且容易出错。
答案 0 :(得分:2)
我想这会奏效。应用基于时间的“垃圾收集”听起来也很合理。是的,使用Processor API代替DSL有一些DIY的味道 - 首先不是PAPI的目的(使用户能够做任何需要的事情)。
虽然有一些评论:
punctuate()
是基于流时间进度调用的,所以您可能会在两次调用之间为一个键创建超过10条记录。因此,您需要KeyValueIterator<String, List<Message[]>> it = messageStore.all();
之类的内容才能为每个密钥存储多个批次。