问题描述
我很感激有关使用有状态函数的一些建议。 我们目前正在使用 Flink,我们从多个 kafka 流中消费、聚合、运行计算,然后输出到新的流。 问题是计算元素是由不同的团队提供的,他们选择的语言是 Python。我们希望为他们提供独立于流元素开发和更新其组件的能力。 最初,我们只是将他们的代码移植到 Java。 有状态函数似乎在这里提供了一种替代方法,我们将保留一些功能,并将模型作为 Python 中的有状态函数托管。但是,我想知道,与仅在自己的管道上托管计算模块并在 Flink 中使用 AsyncFunction 与之交互相比,这是否有任何优势。 如果我们转向有状态函数,我不禁感到我们在不使用其强大功能的情况下增加了复杂性,但我可能会遗漏一些关于速度和弹性的重要考虑因素?
解决方法
首先我想指出 Stateful Functions 确实有一个 DataStream 互操作模块。这意味着您可以使用 StateFun 来处理管道的 Python 函数,而无需重写整个 Flink 作业。
也就是说,有状态函数比使用 AsyncIO 和自己做有什么优势?
-
自动处理连接、批处理、反压和重试。即使您使用的是单个 Python 函数且没有状态,Stateful Functions 也已进行了大量优化,以尽可能快速和高效,并通过社区的持续改进,您将可以免费利用这些改进。 StateFun 拥有比 AsyncIO 更复杂的反压和重试机制,您需要自己重新开发。
-
更高级别的 API。 StateFuns Python SDK(和其他)提供定义明确、类型化的 api,易于开发。与您合作的另一个团队只需要几行胶水代码即可与 StateFun 集成,而该项目将为您处理传输协议。
-
状态!正如项目名称所暗示的那样,有状态的函数是有状态的。 Python 函数可以保持状态,并且您将获得 Flink 开箱即用的一次性保证。