我有一个名为processor
的{{1}}。
在AddCashProcessor
中,我维护AddCashProcessor
以记录按KeyValueStore<String, HashSet<String>>
方法为该项目付费的用户ID。像这样的代码:
process
在名为@Override
public void process(String key, String value) {
HashSet<String> set = Optional.ofNullable(store.get(key)).orElse(new HashSet<>());
set.add(value);
store.put(key, set);
}
的{{1}}类的punctuate
方法中,我AddCashPunctuator
将其插入MySQL:
implements the Punctuator interface
HashSet.size()
已在@Override
public void punctuate(long l) {
List<String> updateSqls = new ArrayList<>();
KeyValueIterator<String, HashSet<String>> iter = store.all();
while (iter.hasNext()) {
KeyValue<String, HashSet<String>> entry = iter.next();
int size = entry.getValue().size();
....
}
}
iter.close();
MySqlUtils.update(updateSqls);
}
AddCashPunctuator
方法中注册,如下所示:
init
我想每30秒执行一次AddCashProcessor
方法。但它不是这样做的。有时它运行良好,有时暂停。当暂停结束时,会执行很多次。
为什么会这样?是因为@Override
public void init(ProcessorContext context) {
this.context = context;
....
this.context.schedule(30000L, PunctuationType.WALL_CLOCK_TIME, new AddCashPunctuator());
}
或punctuate
的数据太大了吗?
我的kafka流版本是1.0.0。我的kafka版本是0.10.1.1。
谢谢!
答案 0 :(得分:1)
在Kafka Streams中,有一个线程负责常规处理和标点符号。因此,如果您的处理时间超过标点符号计划,则可能会延迟对标点符号的调用。独立于此,GC暂停可能会延迟标点符号。
因此,标点符号(对于任何具有GC暂停的系统)都是最好的努力(即使有专门的标点符号线程)。
如果错过标点符号,不幸的是,Kafka Streams重播所有错过的标点符号。这就是你一次获得多个的原因。即将推出的1.1版本(https://issues.apache.org/jira/browse/KAFKA-6323)已经有了修复。