首页 > 解决方案 > 我应该在 apache flink 中使用异步代码还是同步代码

问题描述

当我的应用程序与 IO(数据库,第三个 API,...)交互时,我使用 Async 作为 Flink 的推荐:https ://ci.apache.org/projects/flink/flink-docs-stable/dev/流/运营商/asyncio.html。但是我的应用程序通常与数据库交互,我应该总是使用异步吗?

我有很多问题:

  1. 如果我使用异步(completablefuture),那么我的应用程序不会像使用同步代码时那样被阻塞=>就性能而言,异步代码是更好的同步代码吗?
  2. 如果我使用同步代码并增加并行,性能如何?
  3. 当我使用异步代码时,过了一会儿,我的应用程序抛出异常“邮箱处于关闭状态,但需要处于打开状态才能进行放置操作”。看起来它与打开许多线程有关?

标签: apache-flink

解决方案


由于以下原因,使用异步 i/o 更好:

  1. 更好的资源利用。如果您发出同步请求,那么一项任务将一次只处理一个请求。使用异步请求,单个任务可以处理数十个进行中的请求。
  2. 当您的用户代码被阻止等待对同步请求的响应时,该操作员无法参与检查点。在最好的情况下,这会使检查点变慢,并可能导致检查点超时和作业失败。

是的,您可以通过增加并行度来使同步 i/o 工作。但这是在一个有更好解决方案的问题上投入资源。

至于邮箱问题,我相信只有在作业关闭时才会发生这种情况。我认为这是导致工作失败的其他问题的副作用。也许在日志中四处寻找正在发生的事情的其他迹象。


推荐阅读