Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 侦探追踪不适用于事务性卡夫卡制作人_Apache Kafka_Spring Kafka_Spring Cloud Sleuth_Brave - Fatal编程技术网

Apache kafka 侦探追踪不适用于事务性卡夫卡制作人

Apache kafka 侦探追踪不适用于事务性卡夫卡制作人,apache-kafka,spring-kafka,spring-cloud-sleuth,brave,Apache Kafka,Spring Kafka,Spring Cloud Sleuth,Brave,目前,我们正在使用事务性卡夫卡制作者。我们注意到,卡夫卡的跟踪方面缺失了,这意味着我们无法看到卡夫卡制作人的插装,从而遗漏了b3头 在查看代码之后,我们发现事务生产者不会调用后处理器,这意味着TracingProducerPostProcessor永远不会创建TracingProducer。这有什么原因吗?另外,为事务生产者启用跟踪的工作环境是什么?似乎没有一个地方可以轻松创建跟踪制作人(DefaultKafkaProducerFactory#doCreateTxProducer是私有的) 附加

目前,我们正在使用事务性卡夫卡制作者。我们注意到,卡夫卡的跟踪方面缺失了,这意味着我们无法看到卡夫卡制作人的插装,从而遗漏了b3头

在查看代码之后,我们发现事务生产者不会调用后处理器,这意味着TracingProducerPostProcessor永远不会创建TracingProducer。这有什么原因吗?另外,为事务生产者启用跟踪的工作环境是什么?似乎没有一个地方可以轻松创建跟踪制作人(DefaultKafkaProducerFactory#doCreateTxProducer是私有的)

附加屏幕截图(默认KafkaProducerFactory类)。在屏幕截图中,您可以看到后处理器仅为原始生产者调用,而不是为事务生产者调用

非常感谢你的帮助

谢谢

为事务性和非事务性生产者调用
createRawProducer()

还有别的事情

编辑

问题是,sleuth用一个不同的生产商替换了生产商,但工厂丢弃了它并使用了原始的生产商

EDIT2

事实上,我们在这里放弃跟踪生产者是件好事;Sleuth还将工厂包装在代理中,并将
CloseSafeProducer
包装在
TracingProducer
中;但我在事务性和非事务性生产者身上看到了相同的结果

@springboot应用程序
公共类SO67194702应用程序{
公共静态void main(字符串[]args){
SpringApplication.run(So67194702Application.class,args);
}
@豆子
公共应用程序运行程序(ProducerFactory pf){
返回参数->{
Producer prod=pf.createProducer();
生产关闭();
};
}
}
close()
上放置断点


感谢Gary Russell的快速回复。createRawConsumer有效地为事务性和非事务性使用者调用

Sleuth正在使用TraceConsumerPostProcessor将Kafka消费者包装成TracingConsumer。由于ProducerPostProcessor接口扩展了Function接口,我们可能认为可以/应该使用函数的结果,但DefaultKafkaProducerFactory的createRawConsumer方法正在应用后处理器,而不使用返回类型。导致此特定情况下出现问题的原因

所以,我们不能修改createRawConsumer的实现来分配后处理器的结果吗。如果不是,让后处理器扩展消费者而不是函数不是更好吗

通过重写createRawConsumer方法进行的成功测试,如下所示

    @Override
    protected Producer<K, V> createRawProducer(Map<String, Object> rawConfigs) {
        Producer<K, V> kafkaProducer = new KafkaProducer<>(rawConfigs, getKeySerializerSupplier().get(), getValueSerializerSupplier().get());
        for (ProducerPostProcessor<K, V> pp : getPostProcessors()) {
            kafkaProducer = pp.apply(kafkaProducer);
        }
        return kafkaProducer;
    }
@覆盖
受保护的生产者createRawProducer(映射rawConfigs){
Producer kafkaProducer=新的kafkaProducer(rawConfigs,getKeySerializerSupplier().get(),getValueSerializerSupplier().get());
对于(ProducerPostProcessor pp:getPostProcessors()){
kafkaProducer=pp.apply(kafkaProducer);
}
返回卡夫卡制作人;
}

谢谢你的帮助。

谢谢你的回答。我想我知道问题出在哪里了;我们调用
apply()
,但不使用结果替换生产者。我看不出这对任何一种制作人都有效;它更复杂;事实证明,我们放弃跟踪生产者是一件好事,因为Sleuth还使用代理来包装工厂,然后使用
跟踪生产者来包装
CloseSafeProducer
;但我认为它对事务性和非事务性生产者的工作方式是相同的;我将更新我的答案。在producer方面,似乎只有在工厂上调用createProducer方法时才会触发SleuthKafkaAspect,但在我们的例子中,由于事务性支持,将调用方法CreateNonTransactionAlpProducer(KafkatTemplate#getTheProducer)。所以,我们并没有一个重复的跟踪包装和修复。你应该向sleuth提出一个问题。作为一种解决方法,您可以为非事务性生产者使用不同的生产者工厂和模板。非常感谢您的回复。