akka http请求超时问题

g6ll5ycj  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(680)

我们有一个用例根据给定的时间间隔生成数据。通过一个请求,我们将从不同的组织获取相同的数据。
在生成数据的过程中,postgres数据库上有大量的查询,即70-80多个查询,在处理完数据后,我们返回数据。
一切都是用scala实现的。但这是给时间,所以我已经增加到5分钟。

post {
      pathPrefix("reporting") {
        path("data") {
          withRequestTimeout(300.seconds) {
           //code
     }
 } 

Response: [akka.actor.ActorSystemImpl(inbox-reporting)] Request timeout encountered for request [POST /reporting/data Strict(123 bytes)]

即使在5分钟之后,它也会在请求的2-3分钟内给出信息请求超时,然后就不会返回任何数据。300时间也不是一个可扩展的解决方案,因为生产中将有更多的数据。
有什么方法可以在同一个日期处理如此大的数据而不延迟?
任何帮助都将不胜感激。谢谢

oxosxuxt

oxosxuxt1#

如果请求超时,那么代码将花费太长时间来生成答案,因此问题是数据库代码而不是这个http代码。
您需要在代码中添加更详细的计时,以了解为什么处理请求需要这么长时间。这将帮助您了解这是简单的过载问题,还是针对特定请求类的更具体问题。
我使用这样的代码来 Package 代码的不同部分:

private var timeDepth = 0

def time[T](op: String)(code: => T)(implicit logger: Logger): T = {
  timeDepth += 1
  val pad = "\t"*timeDepth
  logger.info("{}Begin {}", pad, op)

  val start = System.currentTimeMillis()
  val res = code
  val stop = System.currentTimeMillis()

  logger.info("{}{} took {}ms", pad, op, stop - start)
  timeDepth -= 1
  res
}

用法:

val result =
    time("Read from database") {
      //code
    }

如果问题是过载,那么您需要在更上游的地方加入一些速率调整,而不是在部分完成请求上浪费时间。

相关问题