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

时间:2020-04-30 10:42:11

标签: state apache-flink stateful flink-statefun

我正在尝试使用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);
    }

FnScenarioManager:

@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 中间崩溃,会发生什么情况?

  • 每个方案都会运行一次吗?如果没有的话,我该如何确保?

1 个答案:

答案 0 :(得分:1)

状态函数(通常是Apache Flink)支持一次精确的状态语义。这意味着在发生故障的情况下,运行时将以模拟完全无故障执行的方式一致地回滚状态和消息。

这意味着可以重播消息,但是内部状态将回滚到接收消息之前的时间点。只要您的业务规则仅修改statefun状态并通过出口与外界交互,您就可以将系统视为具有一次属性。