2013-04-27 87 views
3

這是對my previous question的後續處理:如何保證Actor的響應時間?

假設我有一個演員,它每秒處理X個請求。但是有時會發生突發事件,並且客戶端每秒發送Y > X個請求。現在我必須保證客戶端在給定的超時時間內收到一個響應(以太網成功超時狀態)。

假設我使用Scala和Akka,你會建議如何實現它?

回答

3

首先,一些代碼例子來說明超時處理:

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或來自超時的響應來完成,無論先發生什麼。