Apache flink 如何在Apache Flink中处理瞬态/应用程序故障?
我的Flink处理器监听Kafka,处理器中的业务逻辑涉及调用外部REST服务,并且服务可能会关闭。我想将元组重放回处理器中,是否仍有这样做的方法?我使用了Storm,我们将能够使元组失败,这样元组就不会被确认。因此,相同的元组将被重放到处理器 在Flink中,消息被Flink Kafka消费者消费后,元组将自动确认。有办法解决这个问题。其中一种方法是将消息发布回同一队列/重试队列。但我正在寻找一个类似于Storm的解决方案 我知道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的。它允许您执行异步任务,而不会阻止运算符的执行 如果您想重试失败的操作,而不从最后一个成功的检查点重新启动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
,则它将触发故障转移,这将导致作业从最后一个成功的检查点重新启动