该翻译原文来之flink官网asyncio.html
用于外部数据访问的异步I/O
本页面解释了如何使用Flink的API对具有外部数据存储的异步I/O进行操作。对于不熟悉异步或事件驱动编程的用户,一篇关于Futures和事件驱动编程的文章可能是有用的准备。
注意:关于异步I/O实用程序的设计和实现的详细信息可以在建议和设计文档FLIP-12: Asynchronous I/O Design and Implementation中找到。
异步I/O操作的需要
当与外部系统交互时(例如,当使用存储在数据库中的数据丰富流事件时),需要注意与外部系统的通信延迟不会流应用程序的全部工作。
天真地访问外部数据库中的数据,例如在MapFunction中,通常意味着同步交互:一个请求被发送到数据库,MapFunction等待,直到收到响应。在许多情况下,这种等待占据了函数的绝大部分时间。
与数据库的异步交互意味着一个并行函数实例可以同时处理多个请求并同时接收响应。这样,等待时间就可以被发送其他请求和接收响应所覆盖。至少,等待时间是在多个请求上平摊的。在大多数情况下,这将导致更高的流吞吐量。
注:改进吞吐量仅仅改变MapFunction非常高并行度在某些情况下是可能的,但通常意味着非常高的资源成本:有更多的并行MapFunction实例意味着更多的任务,线程,Flink-internal网络连接,网络连接到数据库,缓冲区,和一般内部记帐开销。
预备知识
如上一节所示,对数据库(或键/值存储)实现适当的异步I/O需要客户端到支持异步请求的数据库。许多流行的数据库都提供这样的客户端。
在没有此类客户端的情况下,可以通过创建多个客户端并使用线程池处理同步调用,尝试将同步客户端转换为有限的并发客户端。然而,这种方法通常比适当的异步客户端效率要低。