与演员akka http:错误503超时

时间:2016-12-21 16:23:25

标签: scala akka akka-http

我正在尝试在Scala上实现AKKA http和一些演员。 我用akka创建了一个web应用程序。 但我在一个或两个不同的路线/ 16上有这个错误。 (显然是随机的):

  

服务器无法及时回复您的请求。   请稍后再试一次!

你能解释一下为什么以及如何解决这个问题? 我真的是阿卡的新手。

主要课程:

object WebServer extends App {

    implicit val system = ActorSystem("app-1")
    implicit val materializer = ActorMaterializer()
    // needed for the future flatMap/onComplete in the end
    implicit val executionContext = system.dispatcher
    val routes = SessionRoute.route
     val bindingFuture = Http().bindAndHandle(routes, ipServer, configApplication.getInt("spray.can.client.proxy.http.port"))
    println("serv http launch")
    StdIn.readLine
    bindingFuture
        .flatMap(_.unbind()) // trigger unbinding from the port
        .onComplete(_ => {
        cluster.close()
        system.terminate()
    })
    bindingFuture.onFailure {
        case ex: Exception =>
            println(ex, "Failed to bind to {}:{}!", ipServer, configApplication.getInt("spray.can.client.proxy.http.port"))
    }
    }

我的路线是:

object SessionRoute extends TokenValidator {
implicit val formats = org.json4s.DefaultFormats

val sessionHandler = WebServer.system.actorOf(SessionHandler.props(), "SessionHandler")
implicit val timeout = Timeout(60.seconds)


val route: Route = get {
    authenticated(doAuthPublisher) { app =>
         getActiveUserPublisher 
    }
}
def getActiveUserPublisher =
    path("session" / JavaUUID / "active_user") { publisher_id =>
        parameters('date_start.as[Long], 'date_end.as[Long]) {
            (date_start, date_end) => {
                onSuccess(sessionHandler ? SessionActiveUser(SessionRequest(publisher_id, date_start, date_end, null))) {
                    case response: Answer =>
                        complete(StatusCodes.OK, response.result)
                    case _ =>
                        complete(StatusCodes.InternalServerError, "Error on the page")
                }
            }
        }

    }
}

我的演员是:

    object SessionHandler {
        def props(): Props = {
            Props(classOf[SessionHandler])
        }
    }
    class SessionService(implicit actorSystem: ActorSystem) extends toolService {
     def activeUser(sessionRequest: SessionRequest): Map[String, Any] = {
    ....
      }
    }

class SessionHandler extends Actor with ActorLogging {
    implicit val system = ActorSystem("session")
    implicit val formats = org.json4s.DefaultFormats

    def receive: Receive = {
     case request: SessionActiveUser =>
     sender() ! Answer(Serialization.write(new SessionService().activeUser(request.sessionRequest)))
    }}

我的案例类使用了:

final case class Answer(result: String)
case class SessionActiveUser(sessionRequest: SessionRequest)
case class SessionRequest(publisher_id: UUID = null, date_start: Long, date_end: Long, app_id: String = null)

我的configuration.conf:

    akka {
  loglevel = INFO
  stdout-loglevel = INFO
  loggers = ["akka.event.slf4j.Slf4jLogger"]
  default-dispatcher {
    fork-join-executor {
      parallelism-min = 8
    }
  }
 // event-handlers = ["akka.event.slf4j.Slf4jLogger"]
}

1 个答案:

答案 0 :(得分:1)

您看到的错误是由route无法在配置的请求超时内生成响应引起的。如果您没有明确设置它,则默认为20秒。有关请求超时的详细信息,请参阅here

关于发生这种情况的原因,您能详细说明activeUser功能中发生的事情吗?那里发生了什么明显的阻塞?如果是这样,所有传入的请求都会被排序并阻止activeUser,最终导致请求超时终止您的请求。

可能的解决方案是:

  • 使您的服务异步/非阻止
  • 关注如何处理Akka-HTTP路由内的阻塞调用的docs