AKKA HTTP + AKKA流100%CPU利用率

时间:2018-05-26 11:50:45

标签: akka-stream akka-http

我有一个使用Akka HTTP公开一个GET端点的Web API,它采用参数构成请求者的逻辑去使用AKKA Streams调用外部Web服务并根据它的响应并使用akka查询另一个端点流。

第一个外部端点调用看起来像这样

def poolFlow(uri: String): Flow[(HttpRequest, T), (Try[HttpResponse], T), HostConnectionPool] =
    Http().cachedHostConnectionPool[T](host = uri, 80)

def parseResponse(parallelism: Int): Flow[(Try[HttpResponse], T), (ByteString, T), NotUsed] =

    Flow[(Try[HttpResponse], T)].mapAsync(parallelism) {
      case (Success(HttpResponse(_, _, entity, _)), t) =>
        entity.dataBytes.alsoTo(Sink.ignore)
          .runFold(ByteString.empty)(_ ++ _)
          .map(e => e -> t)

      case (Failure(ex), _) => throw ex
    }

def parse(result: String, data: RequestShape): (Coord, Coord, String) =
    (data.src, data.dst, result)

val parseEntity: Flow[(ByteString, RequestShape), (Coord, Coord, String), NotUsed] =
    Flow[(ByteString, RequestShape)] map {
      case (entity, request) => parse(entity.utf8String, request)
    }

和流消费者

val routerResponse = httpRequests
  .map(buildHttpRequest)
  .via(RouterRequestProcessor.poolFlow(uri)).async
  .via(RouterRequestProcessor.parseResponse(2))
  .via(RouterRequestProcessor.parseEntity)
  .alsoTo(Sink.ignore)
  .runFold(Vector[(Coord, Coord, String)]()) {
    (acc, res) => acc :+ res
  }

routerResponse

然后我在routerResponse上做一些计算并为其他外部Web服务创建一个帖子,

第二个外部流消费者

def poolFlow(uri: String): Flow[(HttpRequest, Unit), (Try[HttpResponse], Unit), Http.HostConnectionPool] =
    Http().cachedHostConnectionPoolHttps[Unit](host = uri)

val parseEntity: Flow[(ByteString, Unit), (Unit.type, String), NotUsed] = Flow[(ByteString, Unit)] map {
    case (entity, _) => parse(entity.utf8String)
  }

  def parse(result: String): (Unit.type, String) = (Unit, result)

val res = Source.single(httpRequest)
      .via(DataRobotRequestProcessor.poolFlow(uri))
      .via(DataRobotRequestProcessor.parseResponse(1))
      .via(DataRobotRequestProcessor.parseEntity)
      .alsoTo(Sink.ignore)
      .runFold(List[String]()) {
        (acc, res) => acc :+ res._2
      }

Get Endpoint使用第一个流,然后根据第一个响应

构建第二个请求

注意:

  1. 第一个外部服务是1-2秒的快速时间,第二个外部服务的时间是3-4秒。

  2. 使用parallelism=2查询第一个端点,并使用parallelism=1

  3. 查询第二个端点
  4. 服务正在AWS ECS群集上运行,出于测试目的,它在单个节点上运行

  5. 问题,

    Web服务工作了一段时间但CPU利用率通过处理更多请求而变得更高,我会假设有一些与背压有关的事情被触发,并且在没有请求发送后CPU也保持高度利用率很奇怪

    有没有人知道最新情况

0 个答案:

没有答案