Функции с сохранением состояния. Отказоустойчивое распределение сообщений в Apache Flink - PullRequest
2 голосов
/ 30 апреля 2020

Я пытаюсь реализовать сценарий обмена сообщениями, используя 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?

  • Будет ли каждый сценарий выполняться ровно один раз? если нет, то как я могу это гарантировать?

1 Ответ

1 голос
/ 30 апреля 2020

Stateful Functions (и Apache Flink в целом) поддерживают семантику состояний с однократным определением. Это означает, что в случае сбоя среда выполнения будет последовательно откатывать как состояние, так и сообщения таким образом, чтобы полностью имитировать безошибочное выполнение.

Это означает, что сообщения могут воспроизводиться, но внутреннее состояние будет откатываться до момента времени, предшествующего получению сообщения. Пока ваши бизнес-правила изменяют только состояние состояния и взаимодействуют с внешним миром через выход, вы можете рассматривать систему как имеющую только один раз свойства.

...