我试图了解如何用akka模拟这个。
我的系统为用户处理消息,并且必须为每个用户连续处理消息,即我不能让2个以上的演员同时为同一个用户处理消息。
因此,如果我收到100条消息,而且它们都是针对不同的用户,那么我可以生成尽可能多的演员来处理它们。
但如果我收到100条消息并且它们仅供10位用户使用,我必须确保只有1位演员同时处理给定用户。
我怎么能在Akka模拟这个?我怎样才能过滤消息或管理每个用户只有1个角色?
注意:每条消息都有一个UserId。
答案 0 :(得分:0)
根据给出的信息,您应该考虑使用Cluster Sharding,并根据用户ID进行分片。还有其他解决方案,但这可能是一个很好的选择,并且根据您所描述的内容添加非常简单。
答案 1 :(得分:0)
一种方法是在请求接受actor中的用户ID和其actor之间建立一个映射。因此,每个actor都有一个邮箱,因此它会在一定程度上对传入的邮件进行排队(由您自己设置邮箱大小,甚至可以无限制,只要内存允许)。
换句话说,
class RequestAcceptor extends Actor {
var users: Map[UserId, ActorRef] = Map.empty
def receive = {
case r@UserRequest(userId) =>
val maybeActor = users.get(userId)
if (maybeActor.isDefined) {
maybeActor.get ! r
} else {
val actor = Props(classOf[ProcessingActor])
users += userId -> actor
actor ! r
}
}
}
当然,在这种情况下你必须注意邮箱溢出,但这是一个单独的问题,最有可能最好用Akka Streams解决。