2014-02-27 29 views
2

我有一個工作池與負載均衡,它被定義爲一種方法來路由消息如下:是否有根據阿卡(斯卡拉)藏匿大小

class Worker(workerNr: Int) extends Actor with Stash 
... 
val workers = (1 to poolSize).map(c => context.actorOf(Props(() => new Worker(c)).withDispatcher("stash-dispatcher"), "worker" + c)) 
val pool = context.actorOf(Props[Worker].withRouter(SmallestMailboxRouter(routees = workers))) 
... 
pool ! Request("do something") 

現在這個工人的演員是不是無狀態並且在他將請求轉發給另一個參與者(執行實際工作)並將所有下面的請求存儲起來之前使用,直到他獲得當前請求的響應(可能需要一段時間)。然後,他將響應發送給請求的演員,將所有存儲的消息分離出來,並在切換回不成功後處理下一個請求。

case [email protected](_) => { 
    val requestor = sender 
    requestHandler ! request 
    become { 
    case [email protected](_) => { 
     requestor ! response 
     unstashAll 
     unbecome 
    } 

    case msg => stash 
    } 
} 

我的問題是我正在使用的SmallestMailboxRouter。它將郵件路由到郵箱最小的工作人員。但是由於工作人員沒有阻止,並且存儲了他們目前無法處理的郵件,所以他們的郵箱總是非常空(與他們的存儲相反)。

我想要一個路由器,它將消息路由到最小隱藏的工作者。我以爲自己實現了一個Router,但是看着implementation of Stash,似乎我甚至無法訪問存儲大小,因爲存儲本身對存儲特性是私有的。

private var theStash = Vector.empty[Envelope] 

有沒有辦法做到這一點,或者這是實現與負載均衡工作池錯誤的做法?

+0

爲什麼不在路由器級別保存每個存儲的大小記錄,即每次將消息發送給給定的工作人員時會更新的地圖或其他內容? – Peter

+1

也許這種模式是可能適合您的問題的東西:http://www.michaelpollmeier.com/akka-work-pulling-pattern/ – cmbaxter

+0

@cmbaxter謝謝,這正是我需要的 – lSoleyl

回答

4

回答這個問題你問到底:「有沒有辦法做到這一點,或者這是實現與負載均衡工作池錯誤的做法?」

這裏是我實現工作池與負載均衡的方式:

有一個WorkerManager演員接收作業請求。它立即將它們放入它自己的隊列中。這可以是保存作業請求Job的任何種類的隊列,例如Queue[Job]WorkerManager也有一份工作分配給他們的工作清單,如List[(ActorRef, Option[Job]]

每當WorkerManager收到Job請求並立即將其放入隊列中時,它可以檢查是否有任何閒置的演員在分配的作業列表中,即(ActorRef, None)。如果是這樣,那麼它爲該工作者參與者在該列表中設置分配的作業,並向該參與者發送消息Job。如果沒有空閒的工作人員,WorkerManager根本什麼都不做,並等待其中一個工人回覆工作完成信息。

在另一方面,每當Worker完成處理其回覆給WorkerManagerJob ID和WorkerManagerJob去除分配/運行作業的列表的工作。如果Worker失敗,則可以根據需要使用相同的作業重新啓動。

您可以選擇回覆到Client的人 - 可以是WorkerWorkerManager。爲了達到這些目的,您可能希望將客戶端ActorRef連同Job消息發送到Worker

併發隊列修改或與維護隊列相關的任何競態條件都沒有問題,因爲Actors逐個處理消息,因此WorkerManager將始終按順序處理隊列。

此外Worker可以是狀態機狀態轉換超時,以避免永遠等待它。

工人可以通過WorkerManager創建,也可以單獨創建,也可以通過發送註冊消息註冊WorkerManager。可以有多個WorkerManager角色使用其中一種路由算法(循環法等)來獲取他們的任務。

編輯

顯然有它:)模式 - 這就是所謂的工作格局拉什麼。

+0

官方Akka博客上有一篇文章: http://letitcrash.com/post/29044669086/balancing-workload-across-nodes-with-akka-2 – Ryan

+0

謝謝@Ryan我會讀它。 –