我想将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,请举一个小例子:)
非常感谢!
答案 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");