Flink StatefulFunction 对检查点做出反应?

Flink StatefulFunction reacting to a checkpoint?

我的有状态函数正在将数据写入数据库,但它是不确定的,因此从检查点恢复可能会导致数据库包含不一致的数据。我的想法是 'buffer' Flink 持久化状态的数据,只有在检查点完成后才将数据写入数据库。我想我可以通过使用 context.sendAfter(Duration duration, Address address, Object input); 来实现这一点,方法是将持续时间设置为高于检查点间隔。

是否有更好的解决方案可以使函数明确地对检查点做出反应?

计划 Stateful Functions 2.2 将支持 Flink 数据流作为入口和出口——请参阅 https://github.com/apache/flink-statefun/pull/133——这将允许您使用满足您需求的 Flink 接收器连接器。如果 Flink 还没有包含合适的接收器,您可以基于通用 two-phase 提交接收器(参与检查点过程)实现一个接收器。

另一种选择是以某种方式使有状态函数能够意识到检查点,但到目前为止尚未完成(据我所知,甚至没有讨论过)。

目前,处理 side-effects 离开有状态函数(即写入数据库)的最佳方法是使用恰好一次出口(如 Kafka)。不是直接从函数写入数据库,而是向“副作用出口”发出消息。

要完成此操作,您需要编写一个简单的程序来使用该 Kafka 主题(仅提交的记录)并将它们写入数据库。

为了简化这一点,StateFun 的未来版本将包含一个原生的 exactly once JdbcSink。