Kafka Streams低级处理器API的标点不会定期运行

时间:2018-01-28 01:30:17

标签: apache-kafka apache-kafka-streams

我有一个名为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。

谢谢!

1 个答案:

答案 0 :(得分:1)

在Kafka Streams中,有一个线程负责常规处理和标点符号。因此,如果您的处理时间超过标点符号计划,则可能会延迟对标点符号的调用。独立于此,GC暂停可能会延迟标点符号。

因此,标点符号(对于任何具有GC暂停的系统)都是最好的努力(即使有专门的标点符号线程)。

如果错过标点符号,不幸的是,Kafka Streams重播所有错过的标点符号。这就是你一次获得多个的原因。即将推出的1.1版本(https://issues.apache.org/jira/browse/KAFKA-6323)已经有了修复。