Flink有状态函数:补偿超时时的回调



我正在Flink有状态函数中实现一个用例。我的规范强调,从有状态函数f开始,业务工作流(换句话说,一组有状态函数f1、f2…fn被顺序调用、并行调用或同时调用(有状态函数f等待返回结果以更新本地状态,同时启动超时回调,即向自身发送消息。在超时时,f检查本地状态是否已更新(它已收到结果(,如果是这种情况,则寿命是否良好。

但是,如果在超时时f发现它还没有收到结果,它就必须启动一个补偿工作流来撤消有状态函数f1、f2…fn可能收到的任何更改。

Flink有状态函数框架是否支持设计模式/用例,或者应该在应用程序级别实现?实现这种解决方案最简单的设计是什么?例如,如何知道工作流有状态函数f1、f2…fn的哪些函数受到timedout调用的影响(控制流已超时(?Flink satful函数和集成消息和状态的概念是如何促进这种模式的?

谢谢。

我在Apache Flink邮件列表上发布了这个问题,并得到了Igal Shilman的以下回复,感谢Igal

我想提到的第一件事是,如果这种情况的动机是对瞬态故障的关注,例如:

  • 函数Y是否收到函数X发送的消息
  • 发送消息失败了吗
  • 目标函数是否接受发送给它的消息
  • 消息的顺序弄混了吗
  • etc'

然后,StateFun消除了所有这些问题暂时的错误,否则你将不得不自己处理您的业务逻辑(如重试、回退、服务发现等(。

现在,如果你的激励场景不是短暂的错误,而是更多关于事务性工作流,那么正如Dawid提到的,你必须使生效这在您的应用程序逻辑中。我认为你描述流应该直接映射到一个协调函数(每个流实例(它在内部状态下跟踪结果/超时。

这是一个草图:

  1. 流协调器函数-它将与输入一起调用启动流量所必需的。它将开始调用相关函数(由流的DAG定义(,并将保持内部状态指示调用了哪些函数(地址(及其完成状态。当流成功完成时,协调器可以安全地放弃其状态在协调器决定中止流的任何情况下(内部timeout/外部消息/etc/etc'(,则必须检查其内部状态并启动补偿工作流(向已经成功/正在进行的功能(

  2. 流中的每个功能都必须接受来自协调器的消息,反过来,回答要么成功要么失败。

相关内容

  • 没有找到相关文章

最新更新