【问题标题】:How to limit actors per user如何限制每个用户的演员
【发布时间】:2016-07-03 06:08:34
【问题描述】:

我正在尝试了解如何使用 akka 进行建模。

我的系统为用户处理消息,并且必须为每个用户串行处理消息,即我不能让 2 个以上的参与者同时为同一个用户处理消息。

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

但如果我收到 100 条消息并且它们只针对 10 个用户,我必须确保只有 1 个参与者同时处理给定用户。

我如何在 Akka 中对此进行建模?我如何过滤消息或管理每个用户只有 1 个演员?

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

【问题讨论】:

  • 假设用户 ID 在整个应用程序中是唯一的,为什么不使用用户 ID 命名参与者?这样,您可以搜索演员,如果不存在,则创建一个,并将消息发送给该特定演员。

标签: scala akka


【解决方案1】:

根据给出的信息,听起来您应该考虑使用集群分片,并根据用户 ID 进行分片。还有其他解决方案,但这可能很合适,并且根据您所描述的内容添加起来非常简单。

【讨论】:

    【解决方案2】:

    一种方法是在您的请求接受参与者中在用户 ID 与其参与者之间建立一个映射。因此,每个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 更好地解决。

    【讨论】:

      猜你喜欢
      • 2013-09-07
      • 1970-01-01
      • 2017-08-28
      • 2012-01-25
      • 1970-01-01
      • 2023-03-25
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多