Flink Stateful Functions 与现有的 Flink 应用程序

Flink Stateful Functions with an existing Flink application

我希望得到有关使用有状态函数的一些建议。 我们目前正在使用 Flink,我们从多个 kafka 流中消费,聚合,运行 计算,然后输出到一个新的流。 问题是计算元素是由另一个团队提供的,他们选择的语言是Python。我们希望为他们提供独立于流元素开发和更新其组件的能力。 最初,我们只是将他们的代码移植到 Java。 有状态函数似乎在这里提供了另一种选择,我们可以按原样保留我们的一些功能,并将模型作为有状态函数托管在 Python 中。但是,我想知道,与仅将计算模块托管在其自己的管道上并在 Flink 中使用 AsyncFunction 与其交互相比,这是否有任何优势。 如果我们要转向有状态函数,我不禁会觉得我们在不使用它的强大功能的情况下增加了复杂性,但我可能会遗漏一些关于速度和弹性的重要考虑因素?

首先我想指出有状态函数确实有一个 DataStream 互操作模块。这意味着您可以使用 StateFun 来处理管道的 Python 功能,而无需重写整个 Flink 作业。

也就是说,Stateful Functions 比使用 AsyncIO 和自己做有什么优势?

  1. 自动处理连接、批处理、反压和重试。即使您使用的是单个 python 函数且没有状态,Stateful Functions 也经过了大量优化,以尽可能快速和高效,并且您可以免费利用社区的持续改进。 StateFun 具有比 AsyncIO 更复杂的反压和重试机制,您需要自己重新开发。

  2. 更高级别的 API。 StateFuns Python SDK(和其他)提供易于开发的明确定义的类型化 API。与您合作的另一个团队只需要几行胶水代码即可与 StateFun 集成,而该项目将为您处理传输协议。

  3. 状态!正如项目名称所暗示的那样,有状态函数是有状态的。 Python 函数可以保持状态,您将开箱即用地获得 Flink 的 exactly once 保证。