flink增加异步操作的并行度

时间:2019-07-04 14:55:47

标签: scala apache-flink flink-streaming akka-http

我们有AsyncFunction,异步操作是使用akka http client

完成的
class Foo[A,B] extends AsyncFunction[A, B] with {
  val akkaConfig = ConfigFactory.load()
  implicit lazy val executor: ExecutionContext = ExecutionContext.fromExecutor(Executors.directExecutor())
  implicit lazy val system = ActorSystem("MyActorSystem", akkaConfig)
  implicit lazy val materializer = ActorMaterializer()
    def postReq(uriStr: String, str: String): Future[HttpResponse] = {
        Http().singleRequest(HttpRequest(
          method = HttpMethods.POST,
          uri = uriStr,
          entity = HttpEntity(ContentTypes.`application/json`, str))
        )
      }

 override def asyncInvoke(input: A, resultFuture: ResultFuture[B]) : Unit  = {
    val resultFutureRequested: Future[HttpResponse] = postReq(...)
//the rest of the class ...

问题:

  1. 如果我想提高http请求的并行度-我应该使用akka配置还是可以通过flink.yamel对其进行配置
  2. 由于Flink也使用了akka,因此创建ActorSystemExecutionContext的正确方法是吗?

1 个答案:

答案 0 :(得分:1)

对于第一个问题,您有三种不同的设置会影响性能和实际执行的请求数:

  1. 并行,这将导致Flink创建您的AsyncFunction的多个实例,包括您的HttpClient的多个实例。
  2. 函数本身中的并发请求数。调用orderedWaitunorderedWait时,应在函数中提供capacity,这将限制并发请求的数量。
  3. 您的Http客户端的实际设置。

如您所见,点2和点3已连接,因为Flink可以限制可能的并发请求数,所以有时Http Client设置中的更改可能不会起作用,因为请求数是受Flink自身限制。

根据情况来提高AsyncFunction的吞吐量。您需要记住AsyncFunction是单线程的被叫对象。这基本上意味着,如果您正在调用的服务的响应时间很大,您将仅阻塞等待响应的请求数,因此唯一的方法是增加parallelism'。但是,通常,更改函数的HttpClientcapacity的设置应该可以使您获得更好的吞吐量。

对于第二个问题,我没有看到创建多个ActorSystems的问题。您可以在[此处]看到类似的问题。1