进行KafkaStream处理并行化的更好方法?

时间:2018-08-09 12:29:28

标签: java apache-kafka apache-kafka-streams

下面的

是我的代码段。我想并行化卡夫卡流处理。但我不想放入Runnable,也不想多次启动此应用程序。

有没有类似stream.parallel()的方式?

            final Serde<String> stringSerde = Serdes.String();
        Consumed<String, String> types = Consumed.with(stringSerde, stringSerde);
        //create StreamFactory
        StreamsBuilder builder = new StreamsBuilder();
        //read message from topic
        KStream<String, String> xmlMessages = builder.stream("from_topic", types);

        //select matched messages
        KStream<String, String> matchedMessages = xmlMessages.filter((key, xmlMessageValue) -> {
          //here does the filter tasks 
        });

        //dispatch matched message to destination topic
        matchedMessages.to("to_topic");

        KafkaStreams streams = new KafkaStreams(builder.build(), props);
        streams.start();
        Runtime.getRuntime().addShutdownHook(new Thread(streams::close));

1 个答案:

答案 0 :(得分:1)

您可以通过将num.stream.threads设置为大于默认值1的值来运行多线程流。

Kafka将在内部处理多线程,无需更改应用程序代码(启动其他流或可运行对象)。

但是请注意

  • 使用的线程数量不能超过在其使用的主题中的分区的数量。在多个线程之间分配工作的方式与启动Stream的多个实例的方式完全相同(即,主题分区在其中被平均分配)。
  • 在同一个JVM中具有多个线程(而不是用相同的代码启动多个JVM)并不能为您提供故障转移/重新平衡功能(所有这些线程很可能会共同生存和消亡)。