使用现有 Flink 应用程序的 Flink 状态函数

问题描述

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

解决方法

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

也就是说,有状态函数比使用 AsyncIO 和自己做有什么优势?

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...