Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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 flink 如何在Apache Flink中处理瞬态/应用程序故障?_Apache Flink_Flink Streaming_Flink Cep - Fatal编程技术网

Apache flink 如何在Apache Flink中处理瞬态/应用程序故障?

Apache flink 如何在Apache Flink中处理瞬态/应用程序故障?,apache-flink,flink-streaming,flink-cep,Apache Flink,Flink Streaming,Flink Cep,我的Flink处理器监听Kafka,处理器中的业务逻辑涉及调用外部REST服务,并且服务可能会关闭。我想将元组重放回处理器中,是否仍有这样做的方法?我使用了Storm,我们将能够使元组失败,这样元组就不会被确认。因此,相同的元组将被重放到处理器 在Flink中,消息被Flink Kafka消费者消费后,元组将自动确认。有办法解决这个问题。其中一种方法是将消息发布回同一队列/重试队列。但我正在寻找一个类似于Storm的解决方案 我知道Flink的保存点/检查点将用于容错。但据我所知,在弗林克失败的

我的Flink处理器监听Kafka,处理器中的业务逻辑涉及调用外部REST服务,并且服务可能会关闭。我想将元组重放回处理器中,是否仍有这样做的方法?我使用了Storm,我们将能够使元组失败,这样元组就不会被确认。因此,相同的元组将被重放到处理器

在Flink中,消息被Flink Kafka消费者消费后,元组将自动确认。有办法解决这个问题。其中一种方法是将消息发布回同一队列/重试队列。但我正在寻找一个类似于Storm的解决方案

我知道Flink的保存点/检查点将用于容错。但据我所知,在弗林克失败的情况下,元组将重演。我想了解如何处理暂时性故障


谢谢

当与外部系统交互时,我建议使用Flink的。它允许您执行异步任务,而不会阻止运算符的执行

如果您想重试失败的操作,而不从最后一个成功的检查点重新启动Flink作业,那么我建议您自己实现重试策略。它可以如下所示:

new AsyncFunction<IN, OUT>() {
    @Override
    public void asyncInvoke(IN input, ResultFuture<OUT> resultFuture) throws Exception {
        FutureUtils
            .retrySuccessfulWithDelay(
                () -> triggerAsyncOperation(input),
                Time.seconds(1L),
                Deadline.fromNow(Duration.ofSeconds(10L)),
                this::decideWhetherToRetry,
                new ScheduledExecutorServiceAdapter(new DirectScheduledExecutorService()))
            .whenComplete((result, throwable) -> {
                if (result != null) {
                    resultFuture.complete(Collections.singleton(result));
                } else {
                    resultFuture.completeExceptionally(throwable);
                }
            })
    }
}
新建异步函数(){
@凌驾
public void asyncInvoke(在输入中,ResultFuture ResultFuture)引发异常{
未来趋势
.延迟重试成功(
()->触发同步操作(输入),
时间。秒(1L),
截止日期。从现在开始(持续时间为秒(10L)),
这个::Decidewhethertry,
新的ScheduledExecutorServiceAdapter(新的DirectScheduledExecutorService())
.完成时((结果,可丢弃)->{
如果(结果!=null){
resultFuture.complete(Collections.singleton(result));
}否则{
结果未来。完全例外(可丢弃);
}
})
}
}
使用
triggerAsyncOperation
封装异步操作和
decideWhetherToRetry
封装重试策略。如果
decideWhetherToRetry
返回
true
,则
resultFuture
将使用此操作尝试的值完成

如果异常完成了
resultFuture
,则它将触发故障转移,这将导致作业从最后一个成功的检查点重新启动