Flink 中的
RichAsyncFunction
似乎不支持键控流。我有一个用例,我使用客户端来查找服务以获得某些结果,将其缓存在值状态中,因为我在上游有许多重复的键,其中结果是相同的。 (想想与用户相关的某个属性,但该用户有多个事件,我每次都需要将该属性加入到用户事件中)。
我最初使用阻塞客户端来完成我需要的操作,并且在低流量下工作了一段时间,但是它已经达到了所应用的资源不再充足的状态。
我重新实现了客户端,在调用时返回一个
CompletableFuture<Result>
对象,我想知道将其集成到 KeyedProcessFunction
中的最佳方法是什么,以便我可以利用异步函数调用?
我所做的是首先对 DataStream 进行分区,然后在异步函数内部进行我自己的内存缓存(使用 Guava)。重启时缓存会丢失,但这应该没问题(只是重建缓存时会造成一些效率损失)。
还有另一种方法要复杂得多。您将异步函数的输出保存在某处(例如 Kafka),然后使用该主题作为(键控)源,您可以将其与预先丰富的数据流结合在一起。所以这发生在异步函数的上游。然后,您使用缓存命中的侧面输出,该输出与丰富的流联合到下游。
使用 Kafka 作为同一工作流程的接收器和源,可以让您实现循环 DAG(迭代),而不会遇到 Flink 当前在检查点/仅一次和迭代方面的限制。
这些天我可能会尝试使用 Paimon 作为接收器/源,因为与 Kafka 相比,它的运营开销更低。