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