Java 建议在Kafka Streams应用程序中启动新线程(使用编程方式)吗?

Java 建议在Kafka Streams应用程序中启动新线程(使用编程方式)吗?,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,我们正在使用低级处理器API开发Kafka Streams应用程序 根据Kafka上的文档,所有线程和并行都由流线程和流任务处理。使用主题上的分区也可以扩展并行性 当前代码如下所示: public class Processor implements Processor<K, V> { @Override public void process(String key, V value) { //Do processing on the stream thread

我们正在使用低级处理器API开发Kafka Streams应用程序

根据Kafka上的文档,所有线程和并行都由流线程和流任务处理。使用主题上的分区也可以扩展并行性

当前代码如下所示:

public class Processor implements Processor<K, V> {

@Override
  public void process(String key, V value) {

      //Do processing on the stream thread itself
      ...

      // Write back to output topic
      context.forward(key, updatedValue)
    }); 
  }
}
公共类处理器实现处理器{
@凌驾
公共作废进程(字符串键,V值){
//在流线程本身上执行处理
...
//回写到输出主题
context.forward(键,updatedValue)
}); 
}
}
但是,是否建议在任何情况下创建自己的线程来执行实际处理?这意味着使用Kafka Streams API主要用于消费主题中的数据,而不是用于实际处理。实际处理将发生在Kafka流线程中初始数据消耗之后调用的新线程中

拓扑中的示例处理器:

public class Processor implements Processor<K, V> {

@Override
  public void process(String key, V value) {

  //Spawn new thread to do the processing
    ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.submit(() -> {
      String threadName = Thread.currentThread().getName();
      System.out.println("Hello " + threadName);

      //Do more processing
      ...

      // Write back to output topic
      context.forward(key, updatedValue)
    }); 
  }
}
公共类处理器实现处理器{
@凌驾
公共作废进程(字符串键,V值){
//生成新线程以进行处理
ExecutorService executor=Executors.newSingleThreadExecutor();
执行人提交(()->{
字符串threadName=Thread.currentThread().getName();
System.out.println(“Hello”+threadName);
//做更多的处理
...
//回写到输出主题
context.forward(键,updatedValue)
}); 
}
}
我已经为此尝试了最基本的代码,但无法确定它是否使用卡夫卡提供的自动功能进行干预。例如,自动提交偏移量、超时等


还是坚持卡夫卡流已经提供的默认行为并使用流线程快速处理数据总是更好?

卡夫卡流使用卡夫卡消费者API消费卡夫卡主题的消息。这意味着,即使生成多个线程来使用消息,额外的线程也将保持空闲

例如,如果您的主题有5个分区,那么即使生成10个线程来读取该主题,kafka consumer api也只会使用5个线程来读取该主题,其余的线程将处于空闲状态

您可以在定义streams配置时定义要生成的线程数

Properties streamsConfig = new Properties();

streamsConfig.put(StreamsConfig.NUM_STREAM_THREADS_CONFIG, 1); //Here number of threads being spawned per kafka streams app node is 1 
因此,如果您的主题有10个分区,并且您的kafka streams应用程序部署在两个节点上,那么NUM_STREAM_THREADS_CONFIG将是5


如果你需要更多的帮助,请告诉我

不建议启动自己的线程,因为这破坏了Kafka Streams的容错保证。如果
process()。对于这种情况,Kafka Streams可能会提交输入记录偏移量

但是,如果您在后台线程中处理消息,而该线程处理失败,Kafka Streams将不知道有关它的任何信息,因此,即使发生故障并且消息将丢失,也可能提交偏移量

另外,在返回
process()
之后,不允许后台线程调用
forward()
。如果
forward()


使用您自己的后台线程并至少保留一次处理保证并非不可能,但是,这相当复杂,因此不推荐使用。

谢谢您的回答。我知道我们可以使用NUM\u STREAM\u THREADS\u CONFIG。我现在用代码示例更新了这个问题,以进一步澄清这个问题。