我的有状态函数是将数据写入数据库,但它是不确定的,因此从检查点恢复可能会导致数据库包含不一致的数据。我的想法是在 Flink 的持久状态中“缓冲”数据,并且只有在检查点完成后才将数据写入数据库。context.sendAfter(Duration duration, Address address, Object input);
我想我可以通过使用, 通过将持续时间设置为高于检查点间隔来实现这一点。
是否有更好的解决方案可以使函数明确地对检查点做出反应?
我的有状态函数是将数据写入数据库,但它是不确定的,因此从检查点恢复可能会导致数据库包含不一致的数据。我的想法是在 Flink 的持久状态中“缓冲”数据,并且只有在检查点完成后才将数据写入数据库。context.sendAfter(Duration duration, Address address, Object input);
我想我可以通过使用, 通过将持续时间设置为高于检查点间隔来实现这一点。
是否有更好的解决方案可以使函数明确地对检查点做出反应?
计划 Stateful Functions 2.2 将支持 Flink 数据流作为入口和出口 - 请参阅https://github.com/apache/flink-statefun/pull/133 - 然后应该允许您使用满足您需求的 Flink 接收器连接器. 如果 Flink 还没有包含合适的接收器,您可以基于通用的两阶段提交接收器(参与检查点过程)实现一个。
另一种选择是以某种方式使有状态函数能够意识到检查点,但到目前为止还没有完成(据我所知,甚至没有讨论过)。
目前,处理有状态函数(即写入数据库)的副作用的最佳方法是使用恰好一次的出口(如 Kafka)。与其直接从函数写入数据库,不如向“副作用出口”发出消息。
要完成此操作,您需要编写一个简单的程序来使用该 Kafka 主题(仅提交的记录)并将它们写入数据库。
为了简化这一点,StateFun 的未来版本将包含一个原生 JdbcSink。