Akka HTTP请求超时问题



我们有一个根据给定时间间隔生成数据的用例。通过一个请求,我们就可以从不同的组织获取相同的数据。

在生成数据时,Postgres数据库上有很多查询,即超过70-80个查询,处理完数据后,我们会返回它。

一切都是使用Scala Futures实现的。但它给了我时间,所以我把它增加到了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次也不是一个可扩展的解决方案,因为生产中会有更多的数据。

在没有时间延迟的情况下,如何在同一日期处理如此大规模的处理?

任何帮助都将不胜感激。感谢

如果请求超时,那么代码产生答案的时间太长,所以问题是数据库代码,而不是这个HTTP代码。

您需要在代码中放入更详细的时间安排,以了解为什么处理请求需要这么长时间。这将帮助您了解这是一个简单的过载问题,还是一个特定请求类的更具体的问题。

我使用这样的代码来包装代码的不同部分:

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
}

如果问题是过载,那么您需要在上游进行一些速率调整,而不是将时间浪费在部分完成请求上。

最新更新