如何在 Akka 中管理 HTTP 请求?
How to manage HTTP requests in Akka?
我在我的应用程序中使用 Spray,从我在 Github 上看到的示例来看,人们似乎通过将 HTTPContext 对象传递给所有参与者并调用 onComplete { }
关于最后一个演员的未来。
在应用程序深处发送上下文真的是个好主意吗?这样每个事件对象都会有一个上下文参数。
我们如何在 Akka 中正确处理 HTTP 请求和响应?我读过 this 文章,但我想知道 运行 Akka 在生产中以正确的方式实现这一目标的人的想法。
我更喜欢在 Spray 服务中使用询问模式和 onSuccess 指令,例如:
trait MyService extends HttpService {
def worker: ActorRef
implicit def timeout:Timeout
implicit def ec:ExecutionContext
def askWorker: Future[String] = (worker ? "Hello").mapTo[String]
def myRoute = path("/") {
get {
onSuccess(askWorker){
case str => complete(str)
}
}
}
}
然后是具体的演员如:
class ServiceActor extends MyService with Actor {
implicit val ec = context.system
implicit val timeout = Timeout(3 seconds)
val worker = context.actorOf(Props[WorkerActor])
override def actorRefFactory = context.system
def receive = runRoute(myRoute)
}
我喜欢这种模式而不是四处传递请求上下文,因为这意味着其他参与者不必有任何 Http 的概念。该服务可以完全替换为不同的协议。在这个例子中,worker actor 可以是这样的:
class WorkerActor extends Actor {
def receive = {
case "Hello" => sender() ! "Hello World"
}
}
我在我的应用程序中使用 Spray,从我在 Github 上看到的示例来看,人们似乎通过将 HTTPContext 对象传递给所有参与者并调用 onComplete { }
关于最后一个演员的未来。
在应用程序深处发送上下文真的是个好主意吗?这样每个事件对象都会有一个上下文参数。
我们如何在 Akka 中正确处理 HTTP 请求和响应?我读过 this 文章,但我想知道 运行 Akka 在生产中以正确的方式实现这一目标的人的想法。
我更喜欢在 Spray 服务中使用询问模式和 onSuccess 指令,例如:
trait MyService extends HttpService {
def worker: ActorRef
implicit def timeout:Timeout
implicit def ec:ExecutionContext
def askWorker: Future[String] = (worker ? "Hello").mapTo[String]
def myRoute = path("/") {
get {
onSuccess(askWorker){
case str => complete(str)
}
}
}
}
然后是具体的演员如:
class ServiceActor extends MyService with Actor {
implicit val ec = context.system
implicit val timeout = Timeout(3 seconds)
val worker = context.actorOf(Props[WorkerActor])
override def actorRefFactory = context.system
def receive = runRoute(myRoute)
}
我喜欢这种模式而不是四处传递请求上下文,因为这意味着其他参与者不必有任何 Http 的概念。该服务可以完全替换为不同的协议。在这个例子中,worker actor 可以是这样的:
class WorkerActor extends Actor {
def receive = {
case "Hello" => sender() ! "Hello World"
}
}