我正在实现一个流式应用程序,其中一个有状态运算符正试图捕获"所有者拥有项目"关系。每个所有者键入的状态由有关所有者和每个项目的详细信息组成。物品的所有权可以更改,我希望能够将每个物品关联到其正确的所有者。由于不同所有者的操作员状态可能在不同的子任务中,并且这些子任务旨在独立操作,所以我想知道共享状态的最佳方式是什么。我能想到的一个解决方案是从子任务的副输出创建一个键控数据流,并将其发送给正确的所有者,然后从原始所有者清除状态。本质上:
- 具有关于具有Item1、Item2、…、ItemN的OldOwner的状态的子任务1
- 子任务1将消息写入到侧输出(OldOwner、NewOwner、List[ItemsToTransfer](
- (可选(从关于OldOwner的状态中清除关于List[ItemsToTransfer]的状态
- 从副输出创建一个数据流,并将其发送回相同的操作员,但可能不同的子任务具有关于NewOwner的状态
- 通过添加新的项目集更新NewOwner的状态
由于侧输出用于非常不同的目的(日志记录等(,我想知道这是否可行。与常规数据流相同的容错保证适用于侧输出吗?子任务中可以缓冲的副输出消息的数量是否有限制?
另一种方法可能是获取第一个子任务的输出并将其反馈给同一操作员。理论上,这两种方法都违反了flink作业是DAG的特性,尽管在我的用例中,永远不会有循环数据传输。
您的提议将在拓扑中创建一个循环,因为您需要将侧面输出的事件发送回同一操作员的相同/不同子任务。
您实际上想要的是支持Flink中的多键/多状态事务。Flink本身并没有提供开箱即用的支持。然而,Flink提供了在其基础上构建这样一个功能所需的所有工具。事实上,流媒体账本正是这样做的。它允许您在Flink之上进行多状态交易,并提供一次处理保证。