Apache Flink Stateful Functions пересылает одно и то же сообщение N функциям - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь отправить входящие сообщения нескольким функциям с отслеживанием состояния, но не могу полностью понять, как это сделать. Для простоты предположим, что одна из моих функций с отслеживанием состояния получает некоторые целые числа и отправляет их нескольким удаленным функциям. Эти функции добавляют это целое число к своим значениям состояния и сохраняют его как новое состояние.

Когда одна из этих двух удаленных функций выходит из строя, другая должна продолжать работать таким же образом. Когда сбойная функция восстановлена, она должна обрабатывать сообщения, которые она не может обработать во время сбоя.

Я думал об отправке их одного за другим, как показано ниже, но не думаю, что это сработает

context.send(RemoteFuncType1,someID,someInteger);
context.send(RemoteFuncType2,someID,someInteger);
...
  • как это сделать отказоустойчивым способом?
  • если возможно, как это работает в фоновом режиме?

1 Ответ

2 голосов
/ 10 мая 2020

То, как вы предлагаете это сделать, является правильным!

StateFun будет доставлять сообщения удаленным функциям согласованным образом. Если одна из функций испытывает непродолжительное время простоя, StateFun будет пытаться отправить сообщение до тех пор, пока:

  • Он успешно доставит его (с отключением)
  • Максимальный тайм-аут для повторных попыток быть достигнут. Когда истечет время ожидания, все задание StateFun будет перемотано к ранее согласованной контрольной точке. состояние и сообщение будут доставлены каждой функции. В вашем примере: вторая удаленная функция получит someInteger с любым состоянием, которое она имела раньше, после восстановления.

    Чтобы получить более глубокое понимание того, как работает контрольная точка во Flink и как она обеспечивает точную однократную обработку, я бы порекомендовал следующее:

    https://ci.apache.org/projects/flink/flink-docs-stable/internals/stream_checkpointing.html

...