KafkaStreams在同一个应用程序中的多个流

时间:2018-03-23 19:15:19

标签: apache-kafka apache-kafka-streams

我试图根据KafkaStreams的惯例和合理性做出实际的设计决定。

让我们说我有两个不同的事件要放在KTable中。我有一个生产者将这些消息发送到正在收听该主题的KStream

据我所知,我不能使用KafkaStreams对消息使用条件转发,因此如果流订阅了许多主题(例如,每个上述消息一个),我只能调用{{1在单个接收器主题上 - 否则,我必须在流上调用stream.to,并将带有foreach的消息发送到接收器主题。

以上建议使用单个流。我以为我可以在同一个应用程序中设置多个流,每个流都听一个主题,映射并转发到表接收器,但每次我尝试创建两个KProducer实例时,只有第一个初始化的订阅它的主题 - 另一个从客户端收到一条警告,告知其主题没有订阅。

我可以在同一个应用中设置多个流吗?如果是的话,有什么特殊要求吗?

KafkaStreams

stream config

class Stream(topic: String) {
  val props: Option[Map[String, String]] = Some(TopicProps.get(topic))
  val streamsBuilder = new StreamsBuilder
  val topics = new util.ArrayList[String]
  topics.add(props.get("topic"))

  val stream: KStream[String, String] = configureStream(streamsBuilder, topics, props.get("sink"))

  def configureStream(builder: StreamsBuilder, topics: java.util.List[String], sink: String): KStream[String, String] = {
    builder.stream[String, String](
      topics,
      Consumed.`with`(String(), String())
    )
  }

  def init(): KafkaStreams = {
    val streams = new KafkaStreams(streamsBuilder.build(), KafkaConfig.streamConfig)

    streams.start()

    streams
  }
}

class Streams() {

  val eventStream = new Stream("first_event") //looking good!
  val eventStream2 = new Stream("second_event") // no subscribers
  //if I switch the other of these, eventStream2 is subscribed to and eventStream is dead in the water
  val streams: KafkaStreams = eventStream.init()
  val streams2: KafkaStreams = eventStream2.init()

}

我也喜欢任何建议的替代方案

2 个答案:

答案 0 :(得分:2)

创建KafkaStream时,需要使用不同的application.id传递属性,例如:

props.put(StreamsConfig.APPLICATION_ID_CONFIG,"APP1");
StreamsBuilder builder = new SteamsBuilder();
KStream stream1 = builder.stream("topic1");
KafkaStreams streams = new KafkaStreams(builder, props);
streams.start();

然后你应该创建另一个流:

props.put(StreamsConfig.APPLICATION_ID_CONFIG,"APP2");
StreamsBuilder builder = new SteamsBuilder();
KStream stream2 = builder.stream("topic2");
KafkaStreams streams2 = new KafkaStreams(builder, props);
streams2.start();

答案 1 :(得分:1)

  

据我所知,我不能使用条件转发消息

你知道KStream#branch()吗?它与条件转发基本相同。

  

我以为我可以在同一个应用中设置多个流,每个流都会收听主题,映射并转发到表格接收器,

这应该如下工作:

StreamsBuilder builder = new SteamsBuilder();
KStream stream1 = builder.stream("topic1");
KStream stream2 = builder.stream("topic2");

stream1.to("table1-topic");
stream2.to("table2-topic");
  

但是每当我尝试创建两个KafkaStreams实例时,只有第一个初始化的订阅它的主题 - 另一个从客户端收到一个警告,它的主题没有订阅。

不确定。这应该工作。也许你可以分享你的代码?