Kafka Streams-flatMapValues的积分与可分离处理程序

时间:2018-11-15 14:22:23

标签: apache-kafka apache-kafka-streams

我希望从JAVA中使用Kafka Streams的经验丰富者那里决定可以遵循的两条路径中的一条。我有两个可以使用的JAVA应用程序,它们可以接收整数的入站流并执行各种计算和任务,从而创建了四个针对不同主题的出站流。实际的计算/任务并不重要,我很担心 我可以使用两种可能的方法来定义执行数学运算的处理程序以及我最喜欢的任何相关风险。

方法1 使用类型为 Iterable 的单独定义的函数,并返回 List 类型。

方法2 使用更常见的积分方法,该函数将函数置于 KStream 声明中。

我对Kafka Streams还是陌生的,不想走错路。我喜欢方法1,因为该代码可读性强,易于遵循,并且可以使处理程序脱机测试,而无需调用流中的流量。

方法2似乎更常见,但是随着复杂度的增加,代码在main()中受到污染。此外,我还习惯使用流流量测试算法,这会减慢开发速度。

方法1:可分离的处理程序(部分):

// Take inbound stream from math-input and perform transformations A-D, then write out to 4 streams.
KStream<String, String> source = src_builder.stream("math-input");
source.flatMapValues(value ->  transformInput_A(Arrays.asList(value.split("\\W+")))  ).to("math-output-A");
source.flatMapValues(value ->  transformInput_B(Arrays.asList(value.split("\\W+")))  ).to("math-output-B");
source.flatMapValues(value ->  transformInput_C(Arrays.asList(value.split("\\W+")))  ).to("math-output-C");
source.flatMapValues(value ->  transformInput_D(Arrays.asList(value.split("\\W+")))  ).to("math-output-D");

// More code here, removed for brevity.

// Transformation handlers A, B, C, and D.
// ******************************************************************
// Perform data transformation using method A
  public static Iterable transformInput_A (List str_array) {
       
       // Imagine some very complex math here using the integer
       // values. This could be 50+ lines of code.
      
       for (int i = 0; i < str_array.size(); i++) {
         // grab values and perform ops
       }

      // Return results in string format
      return math_results;
    }

// End of Transformation Method A
// ******************************************************************
// Imagine similar handlers for methods B, C, and D below.

方法2:KStream声明内部的处理程序(部分):

 // Take inbound stream from math-input and perform transformations A-D, then write out to 4 streams.
  KStream<String, String> inputStream = src_builder.stream("math-input");
  KStream<String, String> outputStream_A = inputStream.mapValues(new ValueMapper<String, String>() {
     @Override
     public String apply(String s) {

       // Imagine some very complex math here using the integer
       // values. This could be 50+ lines of code.

       for (int i = 0; i < str_array.length; i++) {
         // grab values and perform ops
       }

       // Return results in Iterbale string format
       return math_results;
     }
  });


  // Send the data to the outbound topic A.
  outputStream_A.to("math-output-A");

  KStream<String, String> outputStream_B ....
  // Use ValueMapper in the KStream declaration just like above. 50+ lines of code
  outputStream_B.to("math-output-B");

  KStream<String, String> outputStream_C ....
  // Use ValueMapper in the KStream declaration just like above. 50+ lines of code
  outputStream_C.to("math-output-C");

  KStream<String, String> outputStream_D ....
  // Use ValueMapper in the KStream declaration just like above. 50+ lines of code
  outputStream_D.to("math-output-D");

除了我希望保持main()整洁并消除复杂性之外,我是否会朝方法1的错误方向前进?

0 个答案:

没有答案