我正在尝试使用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);
}
我的问题是,如果集群在运行事务场景的过程中崩溃,会发生什么?
- 每个场景会只运行一次吗?如果没有,我如何确保
Stateful函数(以及Apache Flink(只支持一次状态语义。这意味着,在出现故障的情况下,运行时将一致地回滚状态和消息,以模拟完全无故障的执行。
这意味着可以重播消息,但内部状态将回滚到接收消息之前的时间点。只要您的业务规则只修改statefun状态并通过出口与外部世界交互,您就可以将系统视为只具有一次属性。