为了避免Flink与外部系统进行交互时候的网络延迟成为系统的瓶颈,Flink在1.2版本引入了Async I/O (Async I/O 是阿里贡献给社区的一个呼声很高的特性)。
在构建实时数仓等应用场景下,与外部 维表等的关联需要大量的和外部存储的交互,此时,一定要仔细处理,不能让Flink与外部之间的交互延迟成为整个实时计算的瓶颈。
本文阐述了如何使用Flink Api来与外部数据存储等进行异步交互。
当编程时使用mapfunction等算子访问外部存储时,默认的交互过程是同步的,即发送数据请求到外部存储并获得返回数据这段时间内,mapfunciton等算子会一直处于等待而无法处理新的数据流,这个等待的过程是非常浪费计算资源以及处理时间的。
在与外部数据源进行交互时,flink的单个算子可以并发处理多个请求并处理返回的相应,这样的话,之前的等待的时间由于发送了其他请求并处理了外部存储返回的结果,整体来看均摊到每个请求的时间大幅度降低,计算资源的利用率也得到了提升, 系统整体可以达到更高的吞吐量。
如下图所示,左侧为同步I/O,右侧为异步I/O。
在使用Flink异步I/O 有个非常重要的前提,就是所访问的外部存储支持异步请求,值得高兴的是,当前主流的存储引擎均支持异步请求。如果所请求的外部存储不支持异步请求,那么可以同时创建多个同步请求并放到线程池中(该种方法相对于直接使用异步请求来说更加低效)。上面这个过程听起来挺复杂,但是在实际使用时,Flink均为我们提供了非常便捷的API,这样的话,我们只需要关注具体的业务逻辑,其他的异步请求发出以及返回结果存储等均由框架帮我们完成。
那么具体如何使用flink异步I/O ?下面 为 Flink官网所推荐的使用方法
/** AsyncFunction实现样例 ,通过向数据库发送异步