这是对my previous question的后续处理:如何保证Actor的响应时间?
假设我有一个演员,它每秒处理X
个请求。但是有时会发生突发事件,并且客户端每秒发送Y > X
个请求。现在我必须保证客户端在给定的超时时间内收到一个响应(以太网成功或超时状态)。
假设我使用Scala和Akka,你会建议如何实现它?
这是对my previous question的后续处理:如何保证Actor的响应时间?
假设我有一个演员,它每秒处理X
个请求。但是有时会发生突发事件,并且客户端每秒发送Y > X
个请求。现在我必须保证客户端在给定的超时时间内收到一个响应(以太网成功或超时状态)。
假设我使用Scala和Akka,你会建议如何实现它?
首先,一些代码例子来说明超时处理:
import akka.actor._
import akka.util.Timeout
import scala.concurrent.duration._
import akka.pattern._
import scala.util._
import java.util.concurrent.TimeoutException
object TimeoutTest {
def main(args: Array[String]) {
val sys = ActorSystem("test-system")
implicit val timeout = Timeout(2 seconds)
implicit val ec = sys.dispatcher
val ref = sys.actorOf(Props[MyTestActor])
val fut = ref ? "foo"
fut onComplete{
case Success(value) => println("Got success")
case Failure(ex:TimeoutException) => println("Timed out")
case Failure(ex) => println("Got other exception: " + ex.getMessage)
}
}
}
class MyTestActor extends Actor{
def receive = {
case _ =>
Thread.sleep(3000)
sender ! "bar"
}
}
你可以看看这个例子,我指定ask
超时2秒钟,我的演员在响应之前3秒钟睡觉。在这种情况下,我将永远得到Failure
包装TimeoutException
。现在,超时处理并非是Scala的Future
类的原生特性,但幸运的是,Akka增加了对其ask
操作的超时支持。在引擎盖下,当你执行ask
时,Akka创建了两个Promises
;一个可以由参与者回复消息完成,另一个由HashedWheelTimer
类中的计时器任务完成。然后,Akka从这两个Promise
实例中获取Futures
,并将它们与Future.firstCompletedOf
合并为一个,因此您从?
调用中返回的Future
可以通过收到消息的actor或来自超时的响应来完成,无论先发生什么。
这取决于你如何使用演员。如果您使用'询问'(如actor ? msg
),您将收到指定时间后超时的未来。
见http://doc.akka.io/docs/akka/snapshot/scala/futures.html(使用与演员)
您可以添加一个onFailure处钩未来它允许你如果未来的超时错误响应发送到客户端。
未来API:http://www.scala-lang.org/api/current/index.html#scala.concurrent.Future