Kafka Streams PAPI:处理器关闭在启动时经常被调用

时间:2018-06-08 10:43:17

标签: scala apache-kafka apache-kafka-streams

Confluent docs on Writing PAPI Applications所示,您应关闭在处理器中使用的商店,覆盖 close 方法。

在WordCountProcessor示例中,它显示了在调用close()方法时应如何关闭存储。

我做过类似的事情(我不是在init()方法中启动它们,而是在Scala中使用lazy val),我发现我的Processor close()方法在创建存储后立即被调用,并且多次。

class EventWindowProcessor(sessionStoreName: String, lastSessionByChannelStoreName: String, lastChannelStoreName: String)
extends AbstractProcesso

// example of a store
private lazy val lastChannelStore: KeyValueStore[MyKey, Channel] =
  context()
    .getStateStore(lastChannelStoreName)
    .asInstanceOf[KeyValueStore[MyKey, Channel]]

override def init(context: ProcessorContext) = {
  super.init(context)
}

override def close() = {
  logger.info("CLOSING PROCESSOR") 
}

override def process(key: String, value: String): Unit = {
    // ... my stuff here
}

所以我得到以下输出,显示在拓扑运行开始时多次调用processor.close(),并且在应用程序的后续点调用。

[2018-06-08 05:13:16,255] INFO Stream Application starting, name: stream-processor (my.package.StreamProcessorApplication$)
[2018-06-08 05:13:16,760] INFO Topology: Sub-topologies:
Sub-topology: 0
Source: event-source (topics: [events])
--> session-processor
Processor: session-processor (stores: [sessionStoreName, lastSessionByChannelStoreName, lastChannelStoreName])
--> error-event-sink, order-sink, pageviews-sink, session-sink
<-- event-source
Sink: error-event-sink (topic: error-events)
<-- session-processor
Sink: order-sink (topic: orders)
<-- session-processor
Sink: pageviews-sink (topic: pageviews)
<-- session-processor
Sink: session-sink (topic: sessions)
<-- session-processor
Global Stores:
none
(my.package.StreamProcessorApplication$)
[2018-06-08 05:14:01,425] INFO CLOSING PROCESSOR (my.package.StreamProcessor)
[2018-06-08 05:14:01,539] INFO CLOSING PROCESSOR (my.package.StreamProcessor)
[2018-06-08 05:14:01,640] INFO CLOSING PROCESSOR (my.package.StreamProcessor)
      ... (102 lines like that)
[2018-06-08 05:29:05,548] INFO   .... my own application logging here 

...所以如果我在close()方法中关闭商店,当我在process()中的代码尝试使用它们时,会出现一个异常,说明商店已关闭。

为什么在KafkaStreams开始时调用processor.close()?为什么它经常发生?

未明确关闭商店有哪些风险?

1 个答案:

答案 0 :(得分:1)

文档中的示例不正确。你不应该关闭商店 - 商店由Kafka Streams管理,Kafka Streams将为您关闭商店。 (我会做一个PR修复代码示例。感谢您指出。)

关于对Processor#close()的调用:预计处理器可能会关闭并重新打开。这在重新平衡期间发生。因此,您必须以对init()close()的多次调用正确工作的方式编写代码 - 我们最近更新了JavaDocs(改进的JavaDocs将成为Kafka 2.0版本的一部分) )。