我正在Flink有状态函数中实现用例。我的规范强调指出,从有状态功能f 开始,业务工作流(换句话说,一组有状态功能f1,f2,...,fn 可以依次调用,并行调用或两者)。 状态函数f 等待返回结果以更新本地状态,它还会启动超时回调,即向自身发送消息。超时时,f检查本地状态是否已更新(已收到结果),如果这样的话,寿命会很长。
但是,如果f在超时时发现尚未收到结果,则必须启动补偿工作流以撤消有状态功能f1,f2,... fn 可能已收到的任何更改。
Flink有状态功能框架是否支持设计模式/用例等,还是应在应用程序级别实现?实现这种解决方案的最简单的设计是什么?例如,如何知道工作流状态函数f1,f2,…fn中的哪些函数受到超时调用的影响(控制流已在那里超时)? Flink令人满意的功能以及集成消息传递和状态的概念如何促进这种模式?
谢谢。
答案 0 :(得分:0)
我想说的第一件事是 出现这种情况的动机是因为出现短暂故障,例如:
然后,StateFun消除了所有这些问题,并消除了 暂时的错误,否则您将不得不自己处理 您的业务逻辑(例如重试,退避,服务发现等)。
现在,如果您的激励方案不是暂时性错误,而是更多 关于事务性工作流,那么正如Dawid所说,您将不得不 实行 这在您的应用程序逻辑中。我认为您描述的方式 流应直接映射到协调函数(每个流实例) 跟踪结果/超时处于其内部状态。
这是草图:
流协调器功能-将使用输入来调用它 必须启动一个流程。它将开始调用相关 功能(由流程的DAG定义)并保持内部状态 指示 调用了哪些功能(地址)及其完成状态。 当流程成功完成时,协调器可以安全地丢弃其 州。 在任何情况下,协调员决定中止流程(内部 超时/外部消息等),则必须检查其内部 陈述并启动补偿工作流程(向 已经成功/正在进行的功能)
流中的每个函数都必须接受来自协调器的消息, 反过来,并以成功或失败进行回复。