Apache Flink有状态函数将相同消息转发给N个函数

时间:2020-05-09 13:38:56

标签: apache-flink fault-tolerance flink-statefun

我正在尝试将传入的消息发送到多个有状态的函数,但是我无法完全理解该怎么做。为了易于理解,假设我的有状态函数之一获取一些整数并将其发送给几个远程函数。这些函数将此整数添加到其状态值中并将其保存为新状态。

当这两个远程功能之一发生故障时,另一个功能应继续以相同的方式工作。 故障功能恢复后,它应该处理在故障期间无法处理的消息。

我考虑过如下所述将它们一个接一个地发送,但我认为这不可行

context.send(RemoteFuncType1,someID,someInteger);
context.send(RemoteFuncType2,someID,someInteger);
...
  • 我该如何以容错的方式做到这一点?
  • 如果可能的话,它如何在后台工作?

1 个答案:

答案 0 :(得分:2)

您建议这样做的方法是正确的方法!

StateFun将以一致的方式将消息传递到远程功能。如果其中一个功能的停机时间很短,StateFun将重试发送消息,直到:

  • 它将成功交付(不带退货)
  • 将达到最大重试超时时间。当达到超时时,整个StateFun作业将倒带到 先前一致的检查点。

由于StateFun正在管理消息传递和功能的状态(包括远程功能),因此它将确保将一致的状态和消息传递给每个功能。 在您的示例中:第二个远程函数一旦恢复就将接收到someInteger,它具有以前的任何状态。

要更深入地了解Fpoint中检查点的工作方式以及它如何在处理后完全启用,我建议以下内容:

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