Apache kafka 具有错误处理和状态存储回滚的处理器拓扑

Apache kafka 具有错误处理和状态存储回滚的处理器拓扑,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我已经给出了从主题、处理器和接收器到其他主题的源拓扑 StoreBuilder storeBuilder = Stores.keyValueStoreBuilder( Stores.persistentKeyValueStore("store"), Serdes.String(), Serdes.String()); Topology topology = new Topology(); topology.add

我已经给出了从主题、处理器和接收器到其他主题的源拓扑

StoreBuilder storeBuilder = Stores.keyValueStoreBuilder(
              Stores.persistentKeyValueStore("store"),
              Serdes.String(),
              Serdes.String());
Topology topology = new Topology();
topology.addSource("incoming", Serdes.String().deserializer(), Serdes.String().deserializer(), "topic");
topology.addProcessor("incoming_first", () -> new MyProcessor(), "incoming");
topology.addStateStore(storeBuilder, "incoming_first");
topology.addSink("sink", "sink", "incoming_first"),
公共类MyProcessor实现处理器{
私有处理器上下文上下文;
private KeyValueStore stateStore;
@凌驾
公共void init(ProcessorContext上下文){
this.context=上下文;
this.stateStore=(KeyValueStore)context.getStateStore(“存储”);
}
@凌驾
公共作废进程(字符串键、字符串值){
stateStore.put(键、值);
....
抛出新的RuntimeException();
....
context.forward();//转发到接收器
}
@凌驾
公众假期结束(){
}
}
我的问题是如何处理写入状态存储后处理器中发生异常的情况。Kafka是否有一些带有状态存储回滚的错误处理机制来重新处理消息或将其转发到错误主题

目前,没有任何处理,我的应用程序完全死机,我需要重新启动它。 另外,如果我添加了一些try catch,那么标识为ok的消息将被更新,并且消息将被发送到changelog主题

我需要一些状态存储的回滚机制吗

KIP说,如果发生异常,状态存储不应使用EOS进行处理,但这仅适用于我的整个应用程序死亡的情况


提前谢谢

对于从
处理器
引发的任何异常,相应的线程将始终死亡。防止这种情况发生的唯一方法是捕获所有异常并相应地处理它们(无论应用程序的正确处理方式是什么)

如果某个线程死亡,而您重新启动应用程序以恢复该线程,则存储是否回滚取决于您的配置。默认情况下,存储不会回滚。只有通过设置配置参数
processing.guaranges=“justly_once”
来启用一次语义,存储才会在重新启动时回滚

如果在
处理器
代码中发现任何异常,并且业务逻辑需要回滚存储,则需要自己实现,首先从存储中获取旧值,更新存储,并在出现异常时将旧值放回存储以覆盖/撤消所有写操作

public class MyProcessor implements Processor<String, String> {

    private ProcessorContext context;
    private KeyValueStore<String, String> stateStore;

    @Override
    public void init(ProcessorContext context) {
        this.context = context;
        this.stateStore = (KeyValueStore<String, String>) context.getStateStore("store");
    }

    @Override
    public void process(String key, String value) {
        stateStore.put(key, value);
        ....
        throw new RuntimeException();
        ....
        context.forward(); //forward to sink
    }

    @Override
    public void close() {
    }
}