2016-03-17 17 views
0

我想了解如何使用akka對此進行建模。如何限制每個用戶的演員

我的系統爲用戶處理消息,並且消息必須爲每個用戶連續處理,即我不能讓2+參與者同時處理同一用戶的消息。所以如果我得到100條消息,並且它們都是針對不同的用戶,我可以派生儘可能多的演員,因爲我需要處理它們。

但是,如果我得到100條消息,並且它們僅針對10個用戶,則必須確保只有1個參與者同時處理給定的用戶。

我怎樣才能在阿卡模擬這個?我如何過濾消息或管理每個用戶只有1個演員?

注意:每封郵件都會有一個UserId。

+0

假設userid在整個應用程序中是唯一的,爲什麼不使用userid命名該actor?通過這種方式,您可以搜索該演員,如果該演員不存在,則將該消息發送給該演員。 – 757071

回答

0

根據給出的信息,聽起來應該考慮使用Cluster Sharding和基於用戶ID的分片。還有其他解決方案,但根據您所描述的內容,這可能非常適合並且很容易添加。

0

一種方法是在您的請求接受演員中在用戶標識和其演員之間建立一個映射。因此,每個參與者都有一個郵箱,以便在一定程度上對傳入消息進行排隊(由郵箱大小決定,它甚至可以是無限的,只要內存允許)。

換句話說,

class RequestAcceptor extends Actor { 
    var users: Map[UserId, ActorRef] = Map.empty 
    def receive = { 
    case [email protected](userId) => 
     val maybeActor = users.get(userId) 
     if (maybeActor.isDefined) { 
     maybeActor.get ! r 
     } else { 
     val actor = Props(classOf[ProcessingActor]) 
     users += userId -> actor 
     actor ! r 
     } 
    } 
} 

當然,你必須要了解在這種情況下,郵箱溢出照顧,但是這將是一個單獨的問題,這是最有可能應更好地與阿卡流解決。

相關問題