Я пытаюсь реализовать сценарий обмена сообщениями, используя apache функции flink stateful.
По своему замыслу мне нужно рассчитать некоторую статистику из входящих сообщений и сохранить ее в состояниях. После этого сценария функции получат доступ к этим состояниям и сообщениям и запустят на них бизнес-правила. Но у нас может быть несколько сценариев ios на сообщение, и каждое из них должно выполняться ровно один раз.
код более или менее выглядит следующим образом
@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);
}
Мой вопрос: что произойдет, если кластер cra sh в середине runTransactionScenar ios?
- Будет ли каждый сценарий выполняться ровно один раз? если нет, то как я могу это гарантировать?