Scala flink提高异步操作的并行性

Scala flink提高异步操作的并行性,scala,apache-flink,flink-streaming,akka-http,Scala,Apache Flink,Flink Streaming,Akka Http,我们有一个异步函数,异步操作是使用 问题: 如果我想提高http请求的并行性,我应该使用akka配置还是有办法通过flink.yamel进行配置 因为Flink也在使用akka,所以这是创建ActorSystem和ExecutionContext的正确方法吗 对于第一个问题,有三种不同的设置可能会影响性能和实际执行的请求数: 并行性,这将导致Flink创建异步函数的多个实例,包括HttpClient的多个实例 函数本身中的并发请求数。调用orderedWait或unorderedWait时,应在

我们有一个异步函数,异步操作是使用

问题:

  • 如果我想提高http请求的并行性,我应该使用akka配置还是有办法通过flink.yamel进行配置
  • 因为Flink也在使用akka,所以这是创建
    ActorSystem
    ExecutionContext
    的正确方法吗

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

  • 并行性,这将导致Flink创建
    异步函数的多个实例,包括
    HttpClient
    的多个实例
  • 函数本身中的并发请求数。调用
    orderedWait
    unorderedWait
    时,应在函数中提供
    容量
    ,这将限制并发请求的数量
  • Http客户端的实际设置 如你所见,第2点。三,。连接,因为Flink可以限制可能的并发请求的数量,所以有时候Http客户端设置中的更改可能不会产生影响,因为请求的数量受Flink intself的限制

    增加
    异步函数的吞吐量取决于具体情况。您需要记住,
    AsyncFunction
    是在单线程中调用的。这基本上意味着,如果您正在调用的服务的响应时间很长,您只需阻塞等待响应的请求数量,因此唯一的方法是增加
    并行度'
    。但是,通常情况下,更改函数的
    HttpClient
    容量
    的设置会使您获得更好的吞吐量


    至于第二个问题,我认为创建多个
    ActorSystems
    没有问题。您可以看到[此处]回答的类似问题。

    这是一个很好的答案-我想再添加一个注意事项,通常您需要配置连接池(使其更大),以便不限制您的最大速率。看见
    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 ...