如何限制每个用户的演员

时间:2016-03-17 03:47:05

标签: scala akka

我试图了解如何用akka模拟这个。

我的系统为用户处理消息,并且必须为每个用户连续处理消息,即我不能让2个以上的演员同时为同一个用户处理消息。

因此,如果我收到100条消息,而且它们都是针对不同的用户,那么我可以生成尽可能多的演员来处理它们。

但如果我收到100条消息并且它们仅供10位用户使用,我必须确保只有1位演员同时处理给定用户。

我怎么能在Akka模拟这个?我怎样才能过滤消息或管理每个用户只有1个角色?

注意:每条消息都有一个UserId。

2 个答案:

答案 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解决。

相关问题