flink中的状态函数容错消息分发

7ajki6be  于 2021-06-26  发布在  Flink
关注(0)|答案(1)|浏览(546)

我尝试使用apache flink有状态函数来实现消息传递场景。
通过设计,我需要从传入的消息中计算一些统计信息,并将它们存储在状态中。之后,场景函数将访问这些状态和消息,并对它们运行业务规则。但是每个消息可能有几十个场景,每个场景应该只运行一次。
代码大致如下

@Override
    public void configure(MatchBinder binder) {
        binder
            .predicate(Transaction.class,this::updateTransactionStatAndSendToScenatioManager)
}

    private void updateTransactionStatAndSendToScenatioManager(Context context, Transaction transaction){
        // state update
        context.send(FnScenarioManager.TYPE,  String.valueOf(transaction.id()) , transaction);
    }

现场经理:

@Override
    public void configure(MatchBinder binder) {
    binder
        .predicate(Transaction.class,this::runTransactionScenarios);
}

private void runTransactionScenarios(Context context, Transaction transaction){
   context.send(Scenario1.TYPE,String.valueOf(transaction.id()),transaction);
   context.send(Scenario2.TYPE,String.valueOf(transaction.id()),transaction);
   context.send(Scenario3.TYPE,String.valueOf(transaction.id()),transaction);
   ...
   context.send(ScenarioN.TYPE,String.valueOf(transaction.id()),transaction);
}

我的问题是,如果集群在runtransactionscenarios中崩溃,会发生什么?
每个场景是否只运行一次?如果不是,我怎么能保证?

gojuced7

gojuced71#

有状态函数(通常还有apache flink)只支持一次状态语义。这意味着,在发生故障的情况下,运行时将以模拟完全无故障执行的方式一致地回滚状态和消息。
这意味着可以重放消息,但内部状态将回滚到接收消息之前的时间点。只要您的业务规则只修改statefun状态并通过出口与外部世界交互,您就可以将系统视为只具有一次属性。

相关问题