@[TOC] flink 1.14 异步 join 思考
背景
flink 1.14 还没提供异步sql 版本jdbc join ,同时也没提供自定义传入SQL 查询结果集,然后再join的功能,但是他们提供了相关接口,恰好这两个功能对提升join 性能,以及SQL的灵活性上有需求,实现了一个版本。其中遇到一个问题,“异步join 的时候,如何保证顺序”?
你需要知道
CustomSqlRowDataAsyncLookupFunction extends AsyncTableFunction<RowData> {
public void eval(CompletableFuture<Collection<RowData>> future, Object... keys) {
// 异步实现逻辑
// 通过继承 AsyncTableFunction 实现自己的异步函数
}
}
其次写过原生datastream 进行异步join的得知道有两个类:
// 这是异步以前用这个实现异步join 的方法,以及参数:AsyncDataStream
public static <IN, OUT> SingleOutputStreamOperator<OUT> unorderedWait(
DataStream<IN> in,
AsyncFunction<IN, OUT> func,
long timeout,
TimeUnit timeUnit) {
return addOperator(/*参数略*/, OutputMode.UNORDERED);
}
public static <IN, OUT> SingleOutputStreamOperator<OUT> orderedWait(
DataStream<IN> in,
AsyncFunction<IN, OUT> func,
long timeout,
TimeUnit timeUnit,
int capacity) {
return addOperator(/*参数略*/, OutputMode.ORDERED);
}
// 核心参数,也就是Operator 通过这个区分了是否有序
OutputMode.UNORDERED
OutputMode.ORDERED
其次
flink 不至于用多套逻辑实现异步,flink-sql 是翻译成算子,也是调用了datastream api 实现这个逻辑,因此我们来看看。
对于async 的 Operator 会有自己的工厂方法:
/* 工厂创建 */
public AsyncWaitOperatorFactory(
AsyncFunction<IN, OUT> asyncFunction,
long timeout,
int capacity,
AsyncDataStream.OutputMode outputMode) {
// 定义的function,包括自定义的function。
// 本质上我们的操作都是一个function进行处理的
this.asyncFunction = asyncFunction;
// 异步的情况一般是需要队列+异步完成时间实现的
// 默认timeout:180000 capacity:100
this.timeout = time