這是對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