Kafka-根据标头值将邮件从“主题A”重定向到“主题B”

时间:2019-03-27 16:43:50

标签: apache-kafka apache-kafka-streams

我想将kafka消息从一个名为“所有主题”的主题重定向到一个名为“ headervalue -topic”的主题,其中 headervalue 是自定义值每封邮件都有标题。

此刻,我正在使用一个自定义控制台应用程序,该应用程序使用消息并将消息重定向到正确的主题,但每秒仅处理16条消息。

kafka和zookeeper都在配置如下的Docker容器中运行:

zookeeper:
  image: "wurstmeister/zookeeper:latest"
  restart: always
  ports:
    - "2181:2181"
  environment:
    ZOOKEEPER_CLIENT_PORT: 2181
    ZOOKEEPER_SERVER_ID: 1

kafka:
  hostname: kafka
  image: "wurstmeister/kafka:latest"
  restart: always
  depends_on:
    - zookeeper
  ports:
    - "9092:9092"
  environment:
    KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
    KAFKA_ADVERTISED_HOST_NAME: kafka
    KAFKA_ADVERTISED_PORT: 9092

实现目标的最好,最快的方法是什么?

我确实知道Kafka Streams的存在,但是我对Java不熟悉,因此如果您想建议Kafka Streams,请举一个小例子:)

非常感谢!

2 个答案:

答案 0 :(得分:0)

这是我使用kafka-streams nodejs库提出的解决方案:

const {KafkaStreams} = require("kafka-streams");
const {nativeConfig: config} = require("./config.js");

const kafkaStreams = new KafkaStreams(config);
const myConsumerStream = kafkaStreams.getKStream("all-topic");

myConsumerStream
    .mapJSONConvenience()
    .filter((element) => {
        return element.value.type == "Article";
    })
    .tap((element) => {console.log("Got Article")})
    .mapWrapKafkaValue()
    .to("Article-topic", 1, "buffer");

myConsumerStream.start();

答案 1 :(得分:0)

据我所知,您不能直接通过DSL访问标头。 不过,您可以使用流处理器通过ProcessorContext访问它,这是我想出的一个小例子:

public class CustomProcessor1 implements Processor<String, String> {
private ProcessorContext context;

@Override
public void init(ProcessorContext processorContext) {
    this.context = processorContext;
}

@Override
public void process(String key, String value) {
    HashMap<String, String> headers = new HashMap<>();
    for (Header header : context.headers()) {
            headers.put(header.key(), new String(header.value()));
    }
    String headerValue = headers.get("certainHeader").replace("\"", "");

    if (headerValue.equals("expectedHeaderValue")) {
        context.forward(key, value);
    }
}

上面是处理器,它将转发具有与headerValue相匹配的someHeader的消息到下游进程。创建如下所示的流拓扑时将使用此处理器:

public static void main(String[] args) throws Exception {
    Properties props = getProperties();

    final Topology topology = new Topology()
            .addSource("SOURCE", "all.topic")
            .addProcessor("CUSTOM_PROCESSOR_1", CustomProcessor1::new, "SOURCE")
            .addProcessor("CUSTOM_PROCESSOR_2", CustomProcessor2::new, "SOURCE")
            .addSink("SINK1", "headervalue1-topic", "CUSTOM_PROCESSOR_1")
            .addSink("SINK2", "headervalue2-topic", "CUSTOM_PROCESSOR_2");