1、aysnc i/o 的设计
The following diagram illustrates how the streaming records are processed while
- arriving at AsyncWaitOperator
- recovering from task failover
- snapshotting state
- being emitted by Emitter Thread
来源:FLIP-12: Asynchronous I/O Design and Implementation - Apache Flink - Apache Software Foundation
1.1、程序设计图
1.2时序图:
2.、Sync I/O 与 Async I/O
我们都知道同步跟异步的区别,异步唯一的好处是不需要等待返回的结果就可以继续运行剩下的逻辑,等异步结果返回时再告知程序即可。如图所示:
3、使用Async I/O的条件
- 对数据库(k/v 存储)实现Async I/O 需要数据源支持客户端异步请求
- 如果不支持,也可以尝试使用线程池来处理异步请求,不过这种情况通常是比能支持异步请求客户端的差一些
4、实践
4.1、接入kafka source
//kafka source
DataStream<String> kafkaStream = SourceUtils.kafkaSourceUtils(env, kafkaProperties, "test_online");
SingleOutputStreamOperator<MediaEntity> mediaSource = kafkaStream
.map(v -> JSON.parseObject(v, MediaEntity.class)).setParallelism(1)
.name("async-kafka-convert-media-map");
4.2、调用 AsyncDataStream
这里有有序跟无须的方法选择,可以根据自己的要求调用,我这里调用的是无序的因为丰富的数据流跟时间没有关系
一共有五个参数,五个不填的时候默认数量是100
4.2、主要是实现一个AsyncFunction
里面有两个重写的方法asyncInvoke和timeout,一个是实现异步的逻辑,一个是超时未返回可以编写自定义的逻辑代码
AsyncDataStream.unorderedWait(mediaSource,
new AsyncFunction<MediaEntity, MediaEntity>() {
@Override
public void asyncInvoke(MediaEntity input, ResultFuture<MediaEntity> resultFuture) throws Exception {
}
@Override
public void timeout(MediaEntity input, ResultFuture<MediaEntity> resultFuture) throws Exception {
}
},
6000,
TimeUnit.MILLISECONDS,
3)
.setParallelism(1)
.name("async_query_from_mysql");
4.3、返回datastream 结果
异步的结果返回时会直接返回成datastream的结果
//3、返回结果
completableFuture.thenAccept((MediaEntity m) -> resultFuture.complete(Collections.singleton(m)));
5、结果
整体下来达到了预期
具体数据及代码请查看github(如果可以,请点一下star⭐️,谢谢支持):
async I/O:flink-learning/ASyncIOMain.java at main · BiGsuw/flink-learning · GitHub