Kafka Streams-覆盖默认的addSink实现/自定义生成器

时间:2020-04-30 14:18:25

标签: apache-kafka-streams

这是我在此处的第一篇文章,并且不确定在此之前是否进行过介绍,但是这里是这样:我有一个Kafka Streams应用程序,使用Processor API,遵循以下拓扑:

1. Consume data from an input topic (processor.addSource())
2. Inserts data into a DB (processor.addProcessor())
3. Produce its process status to an output topic (processor.addSink())

App的工作时间很长,但是,出于可追溯性的目的,我需要在日志中记录kstreams向输出主题及其RecordMetaData(主题,分区,偏移量)生成消息的时间。

以下示例:

KEY="MY_KEY" OUTPUT_TOPIC="MY-OUTPUT-TOPIC" PARTITION="1" OFFSET="1000" STATUS="SUCCESS"

我不确定是否有办法覆盖默认的kafka流生产者来添加此日志记录,或者是否可以创建自己的生产者以将其插入addSink进程。我通过实现自己的ExceptionHandler(default.producer.exception.handler)部分实现了此功能,但它仅涵盖了异常。

谢谢,

吉尔赫姆

1 个答案:

答案 0 :(得分:2)

如果将流应用程序配置为使用letters = [] for word in words.split(): for char in word: letters.append(char) print(letters) ,则应该能够获取所需的信息。具体来说,实施onAcknowledgement()将提供对您上面列出的所有内容的访问。

要在流应用程序中配置拦截器,请执行以下操作:

for m in (move_map[key] for key in move_map if pressed[key]):
    print(m)

如果需要,您可以提供多个拦截器,只需添加类名并将列表实现从单例更改为常规movements = [] for key in move_map: if pressed[key]: movements.append(move_map[key]) for m in movements: print(m) 。拦截器的执行遵循列表中类的顺序。

编辑:为清楚起见,您可以通过KafkaClientSupplier interface在Kafka Streams中覆盖提供的ProducerInterceptor,但是使用拦截器的IMHO是更干净的方法。但是哪个方向取决于您。您在overloaded Kafka Streams constructor中传递 Properties props = new Properties(); // add this configuration in addition to your other streams configs props.put(StreamsConfig.producerPrefix(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG), Collections.singletonList(MyProducerInterceptor.class));