如何一次将记录转发到多个Kafka Stream子处理器?

时间:2019-05-01 17:39:13

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

在Kafka Stream API中,是否可以一次将多个记录转发到不同的子处理器?例如,假设我们有一个称为Processor-Parent的父处理器和两个子处理器Child-1,Child-2。

当Processor-Parent收到要处理的记录时,我想执行以下操作。

new_record = create_new_record(current_record)
context.forward(new_record, To(Child-1))
context.forward(old_record, To(Child-2))

转发这样的记录是一种好习惯吗?

2 个答案:

答案 0 :(得分:1)

这取决于您的要求:

  • 如果您的逻辑很简单,您甚至可以使用Kafka Streams DSL。

  • 如果它是一个,并且您需要Procesor API,但是您希望将相同的记录传递给两个处理器,则可以像提到的@Sameer Killamsetty一样进行操作。

    < / li>
builder = new TopologyBuilder();
    builder.addSource(SOURCE, kafkaTopic)
.addProcessor("child1", () -> new child1(), SOURCE)
.addProcessor("child2", () -> new child2(), SOURCE);
  • 如果它更复杂并且依赖于Processor中的某些逻辑,您希望将消息传递给不同的Processor节点,则可以这样做。
builder = new TopologyBuilder();
    builder.addSource(SOURCE, kafkaTopic)
.addProcessor("InputProcessor", () -> new InputProcessor(), SOURCE)
.addProcessor("child1", () -> new child1(), "InputProcessor")
.addProcessor("child2", () -> new child2(), "InputProcessor");
public class InputProcessor extends AbstractProcessor<String, String> {
    @Override
    public void process(String key, String value) {
        try {
            context().forward(key, Integer.parseInt(value), To.child("child1"));
            context().forward(key, value, To.child("child2"));
        }
        catch (NumberFormatException nfe) {
            context().forward(key, value, To.child("child2"));
        }
    }
}

答案 1 :(得分:-1)

这不是最佳做法。而是使用一个父处理器和多个子处理器创建拓扑。

builder = new TopologyBuilder();
    builder.addSource(SOURCE, kafkaTopic)
.addProcessor("child1", () -> new child1(),SOURCE)
.addProcessor("child2", () -> new child2(),SOURCE);

通过这种方式,kafka流可确保到达源的每个消息都到达两个子处理器。